99import org .hibernate .dialect .Dialect ;
1010import org .hibernate .dialect .pagination .LimitHandler ;
1111import org .hibernate .dialect .pagination .NoopLimitHandler ;
12- import org .hibernate .engine .jdbc .spi .JdbcCoordinator ;
1312import org .hibernate .engine .jdbc .spi .JdbcServices ;
1413import org .hibernate .engine .jdbc .spi .SqlStatementLogger ;
1514import org .hibernate .engine .spi .SessionEventListenerManager ;
1615import org .hibernate .engine .spi .SessionFactoryImplementor ;
17- import org .hibernate .engine .spi .SharedSessionContractImplementor ;
18- import org .hibernate .event .monitor .spi .DiagnosticEvent ;
19- import org .hibernate .event .monitor .spi .EventMonitor ;
2016import org .hibernate .query .spi .Limit ;
2117import org .hibernate .query .spi .QueryOptions ;
2218import org .hibernate .resource .jdbc .spi .JdbcSessionContext ;
@@ -62,7 +58,7 @@ public DeferredResultSetAccess(
6258 JdbcSelectExecutor .StatementCreator statementCreator ,
6359 int resultCountEstimate ) {
6460 super ( executionContext .getSession () );
65- final JdbcServices jdbcServices = executionContext .getSession ().getJdbcServices ();
61+ final var jdbcServices = executionContext .getSession ().getJdbcServices ();
6662
6763 this .jdbcParameterBindings = jdbcParameterBindings ;
6864 this .executionContext = executionContext ;
@@ -71,7 +67,7 @@ public DeferredResultSetAccess(
7167 this .sqlStatementLogger = jdbcServices .getSqlStatementLogger ();
7268 this .resultCountEstimate = resultCountEstimate ;
7369
74- final QueryOptions queryOptions = executionContext .getQueryOptions ();
70+ final var queryOptions = executionContext .getQueryOptions ();
7571 if ( queryOptions == null ) {
7672 finalSql = jdbcSelect .getSqlString ();
7773 limit = null ;
@@ -80,41 +76,54 @@ public DeferredResultSetAccess(
8076 else {
8177 // Note that limit and lock aren't set for SQM as that is applied during SQL rendering
8278 // But for native queries, we have to adapt the SQL string
83- final Dialect dialect = jdbcServices .getDialect ();
79+ final var dialect = jdbcServices .getDialect ();
8480
8581 final String sql = jdbcSelect .getSqlString ();
8682
8783 limit = queryOptions .getLimit ();
8884 final boolean needsLimitHandler = needsLimitHandler ( jdbcSelect );
8985 limitHandler = needsLimitHandler ? dialect .getLimitHandler () : NoopLimitHandler .NO_LIMIT ;
90- final String sqlWithLimit = !needsLimitHandler ? sql : limitHandler .processSql (
91- sql ,
92- jdbcParameterBindings .getBindings ().size (),
93- jdbcServices .getParameterMarkerStrategy (),
94- queryOptions
95- );
86+ final String sqlWithLimit =
87+ needsLimitHandler
88+ ? sqlWithLimit ( jdbcParameterBindings , sql , jdbcServices , queryOptions )
89+ : sql ;
90+
91+ final String sqlWithLocking =
92+ sqlWithLocking ( jdbcSelect .getLockStrategy (), sqlWithLimit , queryOptions , dialect );
93+
94+ finalSql =
95+ dialect .addSqlHintOrComment ( sqlWithLocking , queryOptions ,
96+ executionContext .getSession ().getFactory ()
97+ .getSessionFactoryOptions ().isCommentsEnabled () );
98+ }
99+ }
96100
97- final var lockOptions = queryOptions .getLockOptions ();
98- final var jdbcLockStrategy = jdbcSelect .getLockStrategy ();
99- final String sqlWithLocking ;
100- if ( hasLocking ( jdbcLockStrategy , lockOptions ) ) {
101- final boolean usesFollowOnLocking = useFollowOnLocking ( jdbcLockStrategy , sqlWithLimit , queryOptions , lockOptions , dialect );
102- if ( usesFollowOnLocking ) {
103- sqlWithLocking = sqlWithLimit ;
104- }
105- else {
106- sqlWithLocking = dialect .applyLocksToSql ( sqlWithLimit , lockOptions , emptyMap () );
107- }
108- }
109- else {
110- sqlWithLocking = sqlWithLimit ;
111- }
101+ private String sqlWithLimit (
102+ JdbcParameterBindings jdbcParameterBindings ,
103+ String sql ,
104+ JdbcServices jdbcServices ,
105+ QueryOptions queryOptions ) {
106+ return limitHandler .processSql (
107+ sql ,
108+ jdbcParameterBindings .getBindings ().size (),
109+ jdbcServices .getParameterMarkerStrategy (),
110+ queryOptions
111+ );
112+ }
112113
113- final boolean commentsEnabled = executionContext .getSession ()
114- .getFactory ()
115- .getSessionFactoryOptions ()
116- .isCommentsEnabled ();
117- finalSql = dialect .addSqlHintOrComment ( sqlWithLocking , queryOptions , commentsEnabled );
114+ private static String sqlWithLocking (
115+ JdbcLockStrategy jdbcLockStrategy ,
116+ String sqlWithLimit ,
117+ QueryOptions queryOptions ,
118+ Dialect dialect ) {
119+ final var lockOptions = queryOptions .getLockOptions ();
120+ if ( hasLocking ( jdbcLockStrategy , lockOptions ) ) {
121+ return useFollowOnLocking ( jdbcLockStrategy , sqlWithLimit , queryOptions , lockOptions , dialect )
122+ ? sqlWithLimit
123+ : dialect .applyLocksToSql ( sqlWithLimit , lockOptions , emptyMap () );
124+ }
125+ else {
126+ return sqlWithLimit ;
118127 }
119128 }
120129
@@ -221,7 +230,7 @@ protected void bindParameters(PreparedStatement preparedStatement) throws SQLExc
221230 }
222231
223232 private void setQueryOptions (PreparedStatement preparedStatement ) throws SQLException {
224- final QueryOptions queryOptions = executionContext .getQueryOptions ();
233+ final var queryOptions = executionContext .getQueryOptions ();
225234 // set options
226235 if ( queryOptions != null ) {
227236 final Integer fetchSize = queryOptions .getFetchSize ();
@@ -238,10 +247,10 @@ private void setQueryOptions(PreparedStatement preparedStatement) throws SQLExce
238247 }
239248
240249 private void executeQuery () {
241- final LogicalConnectionImplementor logicalConnection =
250+ final var logicalConnection =
242251 getPersistenceContext ().getJdbcCoordinator ().getLogicalConnection ();
243252
244- final SharedSessionContractImplementor session = executionContext .getSession ();
253+ final var session = executionContext .getSession ();
245254 try {
246255 CORE_LOGGER .tracef ( "Executing query to retrieve ResultSet: %s" , finalSql );
247256 // prepare the query
@@ -254,8 +263,8 @@ private void executeQuery() {
254263 if ( sqlStatementLogger .getLogSlowQuery () > 0 ) {
255264 executeStartNanos = System .nanoTime ();
256265 }
257- final EventMonitor eventMonitor = session .getEventMonitor ();
258- final DiagnosticEvent jdbcPreparedStatementExecutionEvent =
266+ final var eventMonitor = session .getEventMonitor ();
267+ final var jdbcPreparedStatementExecutionEvent =
259268 eventMonitor .beginJdbcPreparedStatementExecutionEvent ();
260269 try {
261270 eventListenerManager .jdbcExecuteStatementStart ();
@@ -326,8 +335,7 @@ protected LockMode determineFollowOnLockMode(LockOptions lockOptions) {
326335
327336 @ Override
328337 public void release () {
329- final JdbcCoordinator jdbcCoordinator =
330- getPersistenceContext ().getJdbcCoordinator ();
338+ final var jdbcCoordinator = getPersistenceContext ().getJdbcCoordinator ();
331339 final LogicalConnectionImplementor logicalConnection = jdbcCoordinator .getLogicalConnection ();
332340 if ( resultSet != null ) {
333341 logicalConnection .getResourceRegistry ().release ( resultSet , preparedStatement );
0 commit comments