Skip to content

Commit ecad65d

Browse files
HHH-16283 minor improvements
1 parent 668ff21 commit ecad65d

File tree

3 files changed

+23
-18
lines changed

3 files changed

+23
-18
lines changed

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

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
import org.hibernate.query.spi.QueryParameterImplementor;
1919
import org.hibernate.query.sql.spi.ParameterOccurrence;
2020
import org.hibernate.query.sql.spi.ParameterRecognizer;
21-
import org.hibernate.sql.ast.internal.ParameterMarkerStrategyStandard;
2221
import org.hibernate.sql.ast.spi.ParameterMarkerStrategy;
2322

2423
/**
@@ -36,15 +35,19 @@ private enum ParameterStyle {
3635
private Map<String, QueryParameterImplementor<?>> namedQueryParameters;
3736
private Map<Integer, QueryParameterImplementor<?>> positionalQueryParameters;
3837

39-
private int parameterImplicitPosition;
38+
private int ordinalParameterImplicitPosition;
39+
40+
private int nextParameterMarkerPosition;
4041
private final ParameterMarkerStrategy parameterMarkerStrategy;
4142

4243
private List<ParameterOccurrence> parameterList;
4344
private final StringBuilder sqlStringBuffer = new StringBuilder();
4445

4546
public ParameterRecognizerImpl(ParameterMarkerStrategy parameterMarkerStrategy) {
46-
this.parameterMarkerStrategy = parameterMarkerStrategy == null ? ParameterMarkerStrategyStandard.INSTANCE : parameterMarkerStrategy;
47-
parameterImplicitPosition = 1;
47+
assert parameterMarkerStrategy != null;
48+
ordinalParameterImplicitPosition = 1;
49+
nextParameterMarkerPosition = 1;
50+
this.parameterMarkerStrategy = parameterMarkerStrategy;
4851
}
4952

5053
@Override
@@ -61,13 +64,13 @@ public void complete() {
6164
if ( first ) {
6265
throw new ParameterLabelException(
6366
"Ordinal parameter labels start from '?" + position + "'"
64-
+ " (ordinal parameters must be labelled from '?1')"
67+
+ " (ordinal parameters must be labelled from '?1')"
6568
);
6669
}
6770
else {
6871
throw new ParameterLabelException(
6972
"Gap between '?" + previous + "' and '?" + position + "' in ordinal parameter labels"
70-
+ " (ordinal parameters must be labelled sequentially)"
73+
+ " (ordinal parameters must be labelled sequentially)"
7174
);
7275
}
7376
}
@@ -105,7 +108,7 @@ else if ( parameterStyle != ParameterStyle.JDBC ) {
105108
throw new ParameterRecognitionException( "Cannot mix parameter styles between JDBC-style, ordinal and named in the same query" );
106109
}
107110

108-
int implicitPosition = parameterImplicitPosition++;
111+
int implicitPosition = ordinalParameterImplicitPosition++;
109112

110113
QueryParameterImplementor<?> parameter = null;
111114

@@ -121,7 +124,7 @@ else if ( parameterStyle != ParameterStyle.JDBC ) {
121124
positionalQueryParameters.put( implicitPosition, parameter );
122125
}
123126

124-
recognizeParameter( parameter, implicitPosition );
127+
recognizeParameter( parameter );
125128
}
126129

127130
@Override
@@ -147,7 +150,7 @@ else if ( parameterStyle != ParameterStyle.NAMED ) {
147150
namedQueryParameters.put( name, parameter );
148151
}
149152

150-
recognizeParameter( parameter, parameterImplicitPosition++ );
153+
recognizeParameter( parameter );
151154
}
152155

153156
@Override
@@ -177,16 +180,16 @@ else if ( parameterStyle != ParameterStyle.NAMED ) {
177180
positionalQueryParameters.put( position, parameter );
178181
}
179182

180-
recognizeParameter( parameter, parameterImplicitPosition++ );
183+
recognizeParameter( parameter );
181184
}
182185

183186
@Override
184187
public void other(char character) {
185188
sqlStringBuffer.append( character );
186189
}
187190

188-
private void recognizeParameter(QueryParameterImplementor parameter, int position) {
189-
final String marker = parameterMarkerStrategy.createMarker( position, null );
191+
private void recognizeParameter(QueryParameterImplementor<?> parameter) {
192+
final String marker = parameterMarkerStrategy.createMarker( nextParameterMarkerPosition++, null );
190193
final int markerLength = marker.length();
191194
if ( parameterList == null ) {
192195
parameterList = new ArrayList<>();

hibernate-core/src/main/java/org/hibernate/sql/ast/spi/ParameterMarkerStrategy.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import org.hibernate.type.descriptor.jdbc.JdbcType;
99

1010
/**
11-
* Strategy for generating parameter markers used in {@linkplain java.sql.PreparedStatement preparable} and native SQL strings.
11+
* Strategy for generating parameter markers used in {@linkplain java.sql.PreparedStatement preparable} SQL strings.
1212
* <p/>
1313
* Generally Hibernate will use the JDBC standard marker - {@code ?}. Many JDBC drivers support the
1414
* use of the "native" marker syntax of the underlying database - e.g. {@code $n}, {@code ?n}, ...

hibernate-core/src/test/java/org/hibernate/orm/test/sql/ast/ParameterMarkerStrategyTests.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
*/
55
package org.hibernate.orm.test.sql.ast;
66

7-
import java.util.List;
87

98
import org.hibernate.annotations.Filter;
109
import org.hibernate.annotations.FilterDef;
@@ -30,6 +29,8 @@
3029
import jakarta.persistence.Table;
3130
import jakarta.persistence.Version;
3231

32+
import java.util.List;
33+
3334
import static org.assertj.core.api.Assertions.assertThat;
3435
import static org.hibernate.internal.util.StringHelper.*;
3536

@@ -130,7 +131,7 @@ public void testNativeQuery(SessionFactoryScope scope) {
130131

131132
statementInspector.clear();
132133
scope.inTransaction( (session) -> {
133-
session.createNativeQuery( "select count(1) from filtered_entity e where e.region = :region" )
134+
session.createNativeQuery( "select count(1) from filtered_entity e where e.region = :region", Integer.class )
134135
.setParameter( "region", "ABC" )
135136
.uniqueResult();
136137

@@ -141,13 +142,14 @@ public void testNativeQuery(SessionFactoryScope scope) {
141142

142143
statementInspector.clear();
143144
scope.inTransaction( (session) -> {
144-
session.createNativeQuery( "select count(1) from filtered_entity e where e.region in (:region)" )
145+
session.createNativeQuery( "select count(1) from filtered_entity e where e.region in (:region) and e.name = :name", Integer.class )
145146
.setParameterList( "region", List.of( "ABC", "DEF" ) )
147+
.setParameter( "name", "It" )
146148
.uniqueResult();
147149

148150
assertThat( statementInspector.getSqlQueries() ).hasSize( 1 );
149-
assertThat( count( statementInspector.getSqlQueries().get( 0 ), "?" ) ).isEqualTo( 2 );
150-
assertThat( statementInspector.getSqlQueries().get( 0 ) ).contains( "?1", "?2" );
151+
assertThat( count( statementInspector.getSqlQueries().get( 0 ), "?" ) ).isEqualTo( 3 );
152+
assertThat( statementInspector.getSqlQueries().get( 0 ) ).contains( "?1" ).contains( "?2" ).contains( "?3" );
151153
} );
152154
}
153155

0 commit comments

Comments
 (0)