Skip to content

Commit f03ed8b

Browse files
author
nathan.xu
committed
HHH-16283 refactor to move marker config into QueryOptions
1 parent c4f8427 commit f03ed8b

File tree

10 files changed

+71
-23
lines changed

10 files changed

+71
-23
lines changed

hibernate-core/src/main/java/org/hibernate/dialect/pagination/LimitHandler.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,9 @@
88

99
import java.sql.PreparedStatement;
1010
import java.sql.SQLException;
11-
import java.util.function.Supplier;
1211

1312
import org.hibernate.query.spi.Limit;
1413
import org.hibernate.query.spi.QueryOptions;
15-
import org.hibernate.sql.ast.spi.ParameterMarkerStrategy;
1614

1715
/**
1816
* Contract defining dialect-specific limit and offset handling.
@@ -49,10 +47,6 @@ default String processSql(String sql, Limit limit, QueryOptions queryOptions) {
4947
return processSql( sql, limit );
5048
}
5149

52-
default String processSql(String sql, Limit limit, QueryOptions queryOptions, Supplier<String> parameterMarkerSupplier) {
53-
return processSql( sql, limit, queryOptions );
54-
}
55-
5650
int bindLimitParametersAtStartOfQuery(Limit limit, PreparedStatement statement, int index) throws SQLException;
5751

5852
int bindLimitParametersAtEndOfQuery(Limit limit, PreparedStatement statement, int index) throws SQLException;

hibernate-core/src/main/java/org/hibernate/dialect/pagination/OffsetFetchLimitHandler.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,7 @@ public OffsetFetchLimitHandler(boolean variableLimit) {
2929
}
3030

3131
@Override
32-
public String processSql(String sql, Limit limit) {
33-
return processSql( sql, limit, null, () -> "?" );
34-
}
35-
36-
@Override
37-
public String processSql(String sql, Limit limit, QueryOptions queryOptions, Supplier<String> parameterMarkerSupplier) {
32+
public String processSql(String sql, Limit limit, QueryOptions queryOptions) {
3833

3934
boolean hasFirstRow = hasFirstRow(limit);
4035
boolean hasMaxRows = hasMaxRows(limit);
@@ -47,6 +42,10 @@ public String processSql(String sql, Limit limit, QueryOptions queryOptions, Sup
4742

4843
begin(sql, offsetFetch, hasFirstRow, hasMaxRows);
4944

45+
Supplier<String> parameterMarkerSupplier = ( queryOptions == null || queryOptions.getLimitHandlerParameterMarkerSupplier() == null )
46+
? () -> "?"
47+
: queryOptions.getLimitHandlerParameterMarkerSupplier();
48+
5049
if ( hasFirstRow ) {
5150
offsetFetch.append( " offset " );
5251
if ( supportsVariableLimit() ) {

hibernate-core/src/main/java/org/hibernate/query/internal/QueryOptionsImpl.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import java.util.HashSet;
1212
import java.util.List;
1313
import java.util.Set;
14+
import java.util.function.Supplier;
1415

1516
import jakarta.persistence.CacheRetrieveMode;
1617
import jakarta.persistence.CacheStoreMode;
@@ -54,6 +55,17 @@ public class QueryOptionsImpl implements MutableQueryOptions, AppliedGraph {
5455
private Set<String> enabledFetchProfiles;
5556
private Set<String> disabledFetchProfiles;
5657

58+
@Nullable
59+
private final Supplier<String> limitHandlerParameterMarkerSupplier;
60+
61+
public QueryOptionsImpl() {
62+
this( null );
63+
}
64+
65+
public QueryOptionsImpl(Supplier<String> limitHandlerParameterMarkerSupplier) {
66+
this.limitHandlerParameterMarkerSupplier = limitHandlerParameterMarkerSupplier;
67+
}
68+
5769
@Override
5870
public Integer getTimeout() {
5971
return timeout;
@@ -257,4 +269,9 @@ public AppliedGraph getAppliedGraph() {
257269
public @Nullable GraphSemantic getSemantic() {
258270
return graphSemantic;
259271
}
272+
273+
@Override
274+
public @Nullable Supplier<String> getLimitHandlerParameterMarkerSupplier() {
275+
return this.limitHandlerParameterMarkerSupplier;
276+
}
260277
}

hibernate-core/src/main/java/org/hibernate/query/spi/QueryOptions.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import java.sql.Statement;
1010
import java.util.List;
1111
import java.util.Set;
12+
import java.util.function.Supplier;
1213

1314
import jakarta.persistence.CacheRetrieveMode;
1415
import jakarta.persistence.CacheStoreMode;
@@ -195,6 +196,10 @@ default ListResultsConsumer.UniqueSemantic getUniqueSemantic(){
195196
return null;
196197
}
197198

199+
default Supplier<String> getLimitHandlerParameterMarkerSupplier() {
200+
return () -> "?";
201+
}
202+
198203
/**
199204
* Provide singleton access for frequently needed options:
200205
*/

hibernate-core/src/main/java/org/hibernate/query/sql/internal/NativeNonSelectQueryPlanImpl.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@
1616
import org.hibernate.query.spi.DomainQueryExecutionContext;
1717
import org.hibernate.query.spi.NonSelectQueryPlan;
1818
import org.hibernate.query.spi.QueryParameterBindings;
19+
import org.hibernate.query.sql.spi.NativeQueryPlan;
1920
import org.hibernate.query.sql.spi.ParameterOccurrence;
20-
import org.hibernate.query.sqm.internal.SqmJdbcExecutionContextAdapter;
2121
import org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl;
2222
import org.hibernate.sql.exec.spi.JdbcOperationQueryMutation;
2323
import org.hibernate.sql.exec.spi.JdbcOperationQueryMutationNative;
@@ -27,7 +27,7 @@
2727
/**
2828
* @author Steve Ebersole
2929
*/
30-
public class NativeNonSelectQueryPlanImpl implements NonSelectQueryPlan {
30+
public class NativeNonSelectQueryPlanImpl implements NonSelectQueryPlan, NativeQueryPlan {
3131
private final String sql;
3232
private final Set<String> affectedTableNames;
3333

@@ -81,7 +81,7 @@ public int executeUpdate(DomainQueryExecutionContext executionContext) {
8181
.getStatementPreparer()
8282
.prepareStatement( sql ),
8383
(integer, preparedStatement) -> {},
84-
SqmJdbcExecutionContextAdapter.usingLockingAndPaging( executionContext )
84+
getSqmJdbcExecutionContext( executionContext, jdbcParameterBindings )
8585
);
8686
}
8787
}

hibernate-core/src/main/java/org/hibernate/query/sql/internal/NativeSelectQueryPlanImpl.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
import org.hibernate.query.spi.ScrollableResultsImplementor;
2323
import org.hibernate.query.sql.spi.NativeSelectQueryPlan;
2424
import org.hibernate.query.sql.spi.ParameterOccurrence;
25-
import org.hibernate.query.sqm.internal.SqmJdbcExecutionContextAdapter;
2625
import org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl;
2726
import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect;
2827
import org.hibernate.sql.exec.spi.JdbcParameterBinder;
@@ -92,7 +91,7 @@ public <T> T executeQuery(DomainQueryExecutionContext executionContext, ResultsC
9291
return executionContext.getSession().getJdbcServices().getJdbcSelectExecutor().executeQuery(
9392
jdbcSelect,
9493
jdbcParameterBindings,
95-
SqmJdbcExecutionContextAdapter.usingLockingAndPaging( executionContext ),
94+
getSqmJdbcExecutionContext( executionContext, jdbcParameterBindings ),
9695
null,
9796
null,
9897
-1,
@@ -135,7 +134,7 @@ public List<R> performList(DomainQueryExecutionContext executionContext) {
135134
return executionContext.getSession().getJdbcServices().getJdbcSelectExecutor().list(
136135
jdbcSelect,
137136
jdbcParameterBindings,
138-
SqmJdbcExecutionContextAdapter.usingLockingAndPaging( executionContext ),
137+
getSqmJdbcExecutionContext( executionContext, jdbcParameterBindings ),
139138
null,
140139
queryOptions.getUniqueSemantic() == null ?
141140
ListResultsConsumer.UniqueSemantic.NEVER :
@@ -179,7 +178,7 @@ public ScrollableResultsImplementor<R> performScroll(ScrollMode scrollMode, Doma
179178
jdbcSelect,
180179
scrollMode,
181180
jdbcParameterBindings,
182-
SqmJdbcExecutionContextAdapter.usingLockingAndPaging( executionContext ),
181+
getSqmJdbcExecutionContext( executionContext, jdbcParameterBindings ),
183182
null,
184183
-1
185184
);

hibernate-core/src/main/java/org/hibernate/query/sql/spi/NativeQueryPlan.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,19 @@
66
*/
77
package org.hibernate.query.sql.spi;
88

9+
import java.util.function.Supplier;
10+
11+
import org.hibernate.internal.util.MutableInteger;
912
import org.hibernate.query.NativeQuery;
13+
import org.hibernate.query.spi.DelegatingQueryOptions;
14+
import org.hibernate.query.spi.DomainQueryExecutionContext;
15+
import org.hibernate.query.spi.QueryOptions;
1016
import org.hibernate.query.spi.QueryPlan;
17+
import org.hibernate.query.sqm.internal.SqmJdbcExecutionContextAdapter;
18+
import org.hibernate.sql.ast.spi.ParameterMarkerStrategy;
19+
import org.hibernate.sql.exec.spi.ExecutionContext;
20+
import org.hibernate.sql.exec.spi.JdbcParameterBindings;
21+
import org.hibernate.type.descriptor.jdbc.IntegerJdbcType;
1122

1223
/**
1324
* Specialization of {@link QueryPlan} for {@link NativeQuery}
@@ -16,4 +27,25 @@
1627
* @author Steve Ebersole
1728
*/
1829
public interface NativeQueryPlan extends QueryPlan {
30+
31+
default ExecutionContext getSqmJdbcExecutionContext(DomainQueryExecutionContext executionContext, JdbcParameterBindings jdbcParameterBindings) {
32+
final ParameterMarkerStrategy parameterMarkerStrategy = executionContext.getSession().getFactory().getServiceRegistry().getService(
33+
ParameterMarkerStrategy.class );
34+
final QueryOptions queryOptions;
35+
if (parameterMarkerStrategy != null) {
36+
final MutableInteger parameterPosition = new MutableInteger( jdbcParameterBindings.getBindings().size() );
37+
queryOptions = new DelegatingQueryOptions( executionContext.getQueryOptions() ) {
38+
@Override
39+
public Supplier<String> getLimitHandlerParameterMarkerSupplier() {
40+
return () -> parameterMarkerStrategy.createMarker(
41+
parameterPosition.incrementAndGet(),
42+
IntegerJdbcType.INSTANCE
43+
);
44+
}
45+
};
46+
} else {
47+
queryOptions = executionContext.getQueryOptions();
48+
}
49+
return SqmJdbcExecutionContextAdapter.usingLockingAndPaging( executionContext, queryOptions );
50+
}
1951
}

hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SqmJdbcExecutionContextAdapter.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,10 @@ public static SqmJdbcExecutionContextAdapter usingLockingAndPaging(DomainQueryEx
3333
return new SqmJdbcExecutionContextAdapter( sqmExecutionContext, sqmExecutionContext.getQueryOptions() );
3434
}
3535

36+
public static SqmJdbcExecutionContextAdapter usingLockingAndPaging(DomainQueryExecutionContext sqmExecutionContext, QueryOptions queryOptions) {
37+
return new SqmJdbcExecutionContextAdapter( sqmExecutionContext, queryOptions );
38+
}
39+
3640
private final DomainQueryExecutionContext sqmExecutionContext;
3741
private final QueryOptions queryOptions;
3842

hibernate-core/src/main/java/org/hibernate/sql/results/jdbc/internal/DeferredResultSetAccess.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
import org.hibernate.event.spi.HibernateMonitoringEvent;
2525
import org.hibernate.internal.CoreLogging;
2626
import org.hibernate.internal.CoreMessageLogger;
27-
import org.hibernate.internal.util.MutableInteger;
2827
import org.hibernate.query.spi.Limit;
2928
import org.hibernate.query.spi.QueryOptions;
3029
import org.hibernate.resource.jdbc.spi.JdbcSessionContext;
@@ -94,12 +93,10 @@ public DeferredResultSetAccess(
9493
}
9594
else {
9695
limitHandler = dialect.getLimitHandler();
97-
final MutableInteger parameterMarkerPosition = new MutableInteger( jdbcParameterBindings.getBindings().size() );
9896
sql = limitHandler.processSql(
9997
jdbcSelect.getSqlString(),
10098
limit,
101-
queryOptions,
102-
() -> parameterMarkerStrategy.createMarker( parameterMarkerPosition.incrementAndGet(), null )
99+
queryOptions
103100
);
104101
}
105102

hibernate-testing/src/main/java/org/hibernate/testing/orm/junit/DialectFeatureChecks.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -703,6 +703,7 @@ public boolean apply(Dialect dialect) {
703703
public static class SupportsNativeParameterMarker implements DialectFeatureCheck {
704704
@Override
705705
public boolean apply(Dialect dialect) {
706+
dialect = DialectDelegateWrapper.extractRealDialect( dialect );
706707
return dialect.getNativeParameterMarkerStrategy() != null;
707708
}
708709
}

0 commit comments

Comments
 (0)