Skip to content

Commit 77c1370

Browse files
committed
HHH-14642, HHH-13717 Various JPA Criteria related fixes
* Get rid of unnecessary whitespace and optional keywords in generated SQL * Handle some type inference related issues with some databases requiring to render casted parameters in some situations * Ensure SQM model is fully serializable * Ensure JPA Criteria throws expected exceptions * Make sure JPA Criteria implementations work properly * Move jpa.test.callback and jpa.test.criteria packages * Improve the reuse of SqmPath instances * Get rid of many raw-types related warnings * Make Predicate extend Expression and handle SQL rendering/emulation * Support fetching SqmTuple as array * Implement treat operator support
1 parent a216a23 commit 77c1370

File tree

332 files changed

+4947
-3217
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

332 files changed

+4947
-3217
lines changed

docker_db.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
mysql_5_7() {
44
docker rm -f mysql || true
5-
docker run --name mysql -e MYSQL_USER=hibernate_orm_test -e MYSQL_PASSWORD=hibernate_orm_test -e MYSQL_DATABASE=hibernate_orm_test -e MYSQL_ROOT_PASSWORD=hibernate_orm_test -p3306:3306 -d mysql:5.7 --character-set-server=utf8mb4 --collation-server=utf8mb4_general_cs
5+
docker run --name mysql -e MYSQL_USER=hibernate_orm_test -e MYSQL_PASSWORD=hibernate_orm_test -e MYSQL_DATABASE=hibernate_orm_test -e MYSQL_ROOT_PASSWORD=hibernate_orm_test -p3306:3306 -d mysql:5.7 --character-set-server=utf8mb4 --collation-server=utf8mb4_bin
66
# Give the container some time to start
77
OUTPUT=
88
n=0

documentation/src/test/java/org/hibernate/userguide/hql/HQLTest.java

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@
2727
import org.hibernate.dialect.CockroachDialect;
2828
import org.hibernate.dialect.DerbyDialect;
2929
import org.hibernate.dialect.H2Dialect;
30-
import org.hibernate.dialect.MySQL5Dialect;
31-
import org.hibernate.dialect.Oracle8iDialect;
30+
import org.hibernate.dialect.MySQLDialect;
31+
import org.hibernate.dialect.OracleDialect;
3232
import org.hibernate.dialect.PostgreSQLDialect;
3333
import org.hibernate.dialect.SQLServerDialect;
3434
import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase;
@@ -1355,7 +1355,8 @@ public void test_hql_current_date_function_example_sql_server() {
13551355
});
13561356
}
13571357

1358-
@Test @RequiresDialect(H2Dialect.class)
1358+
@Test
1359+
@RequiresDialect(H2Dialect.class)
13591360
public void test_hql_current_time_function_example() {
13601361
doInJPA( this::entityManagerFactory, entityManager -> {
13611362
//tag::hql-current-time-function-example[]
@@ -1385,8 +1386,8 @@ public void test_hql_current_timestamp_function_example() {
13851386

13861387
@Test
13871388
@RequiresDialect(H2Dialect.class)
1388-
@RequiresDialect(Oracle8iDialect.class)
1389-
@RequiresDialect(MySQL5Dialect.class)
1389+
@RequiresDialect(OracleDialect.class)
1390+
@RequiresDialect(MySQLDialect.class)
13901391
public void test_hql_bit_length_function_example() {
13911392
doInJPA( this::entityManagerFactory, entityManager -> {
13921393
//tag::hql-bit-length-function-example[]
@@ -1940,7 +1941,7 @@ public void test_hql_relational_comparisons_example_2() {
19401941
@Test
19411942
@RequiresDialect(H2Dialect.class)
19421943
@RequiresDialect(PostgreSQLDialect.class)
1943-
@RequiresDialect(MySQL5Dialect.class)
1944+
@RequiresDialect(MySQLDialect.class)
19441945
public void test_hql_relational_comparisons_example_3() {
19451946

19461947
doInJPA( this::entityManagerFactory, entityManager -> {
@@ -2145,7 +2146,7 @@ public void test_hql_between_predicate_example_1() {
21452146
@Test
21462147
@RequiresDialect(H2Dialect.class)
21472148
@RequiresDialect(PostgreSQLDialect.class)
2148-
@RequiresDialect(MySQL5Dialect.class)
2149+
@RequiresDialect(MySQLDialect.class)
21492150
public void test_hql_between_predicate_example_2() {
21502151

21512152
doInJPA( this::entityManagerFactory, entityManager -> {
@@ -2399,9 +2400,6 @@ public void test_hql_group_by_example_2() {
23992400
}
24002401

24012402
@Test
2402-
@RequiresDialect(H2Dialect.class)
2403-
@RequiresDialect(PostgreSQLDialect.class)
2404-
@RequiresDialect(MySQL5Dialect.class)
24052403
public void test_hql_group_by_example_3() {
24062404

24072405
doInJPA( this::entityManagerFactory, entityManager -> {
@@ -2421,9 +2419,6 @@ public void test_hql_group_by_example_3() {
24212419
}
24222420

24232421
@Test
2424-
@RequiresDialect(H2Dialect.class)
2425-
@RequiresDialect(PostgreSQLDialect.class)
2426-
@RequiresDialect(MySQL5Dialect.class)
24272422
public void test_hql_group_by_example_4() {
24282423

24292424
doInJPA( this::entityManagerFactory, entityManager -> {

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/CUBRIDDialect.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,7 @@ public void initializeFunctionRegistry(QueryEngine queryEngine) {
167167
CommonFunctionFactory.lastDay( queryEngine );
168168
CommonFunctionFactory.weekQuarter( queryEngine );
169169
CommonFunctionFactory.octetLength( queryEngine );
170+
CommonFunctionFactory.bitLength( queryEngine );
170171
CommonFunctionFactory.md5( queryEngine );
171172
CommonFunctionFactory.trunc( queryEngine );
172173
CommonFunctionFactory.truncate( queryEngine );
@@ -386,11 +387,11 @@ public boolean supportsTimezoneTypes() {
386387
public String timestampaddPattern(TemporalUnit unit, TemporalType temporalType) {
387388
switch (unit) {
388389
case NANOSECOND:
389-
return "adddate(?3, interval (?2)/1e6 millisecond)";
390+
return "adddate(?3,interval (?2)/1e6 millisecond)";
390391
case NATIVE:
391-
return "adddate(?3, interval ?2 millisecond)";
392+
return "adddate(?3,interval ?2 millisecond)";
392393
default:
393-
return "adddate(?3, interval ?2 ?1)";
394+
return "adddate(?3,interval ?2 ?1)";
394395
}
395396
}
396397

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/CacheDialect.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -146,9 +146,10 @@ public void initializeFunctionRegistry(QueryEngine queryEngine) {
146146
queryEngine.getSqmFunctionRegistry().registerBinaryTernaryPattern(
147147
"locate",
148148
StandardBasicTypes.INTEGER,
149-
"$find(?2, ?1)",
150-
"$find(?2, ?1, ?3)"
149+
"$find(?2,?1)",
150+
"$find(?2,?1,?3)"
151151
).setArgumentListSignature("(pattern, string[, start])");
152+
CommonFunctionFactory.bitLength_pattern( queryEngine, "($length(?1)*8)" );
152153

153154
useJdbcEscape(queryEngine, "sin");
154155
useJdbcEscape(queryEngine, "cos");
@@ -181,17 +182,17 @@ public void initializeFunctionRegistry(QueryEngine queryEngine) {
181182

182183
@Override
183184
public String extractPattern(TemporalUnit unit) {
184-
return "datepart(?1, ?2)";
185+
return "datepart(?1,?2)";
185186
}
186187

187188
@Override
188189
public String timestampaddPattern(TemporalUnit unit, TemporalType temporalType) {
189190
switch (unit) {
190191
case NANOSECOND:
191192
case NATIVE:
192-
return "dateadd(millisecond, (?2)/1e6, ?3)";
193+
return "dateadd(millisecond,(?2)/1e6,?3)";
193194
default:
194-
return "dateadd(?1, ?2, ?3)";
195+
return "dateadd(?1,?2,?3)";
195196
}
196197
}
197198

@@ -200,9 +201,9 @@ public String timestampdiffPattern(TemporalUnit unit, TemporalType fromTemporalT
200201
switch (unit) {
201202
case NANOSECOND:
202203
case NATIVE:
203-
return "datediff(millisecond, ?2, ?3)*1e6";
204+
return "datediff(millisecond,?2,?3)*1e6";
204205
default:
205-
return "datediff(?1, ?2, ?3)";
206+
return "datediff(?1,?2,?3)";
206207
}
207208
}
208209

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/FirebirdDialect.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,7 @@ public void initializeFunctionRegistry(QueryEngine queryEngine) {
248248
"locate",
249249
StandardBasicTypes.INTEGER,
250250
"position(?1 in ?2)",
251-
"position(?1, ?2, ?3)"
251+
"position(?1,?2,?3)"
252252
).setArgumentListSignature( "(pattern, string[, start])" );
253253
functionRegistry.namedDescriptorBuilder( "ascii_val" )
254254
.setExactArgumentCount( 1 )
@@ -593,7 +593,7 @@ public String getQuerySequencesString() {
593593
? "select rdb$generator_name from rdb$generators"
594594
// Note: Firebird 3 has an 'off by increment' bug (fixed in Firebird 4), see
595595
// http://tracker.firebirdsql.org/browse/CORE-6084
596-
: "select rdb$generator_name, rdb$initial_value, rdb$generator_increment from rdb$generators where coalesce(rdb$system_flag, 0) = 0";
596+
: "select rdb$generator_name,rdb$initial_value,rdb$generator_increment from rdb$generators where coalesce(rdb$system_flag,0)=0";
597597
}
598598

599599
@Override

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/FirebirdSqlAstTranslator.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import org.hibernate.sql.ast.tree.expression.SelfRenderingExpression;
3131
import org.hibernate.sql.ast.tree.expression.SqlTuple;
3232
import org.hibernate.sql.ast.tree.expression.Summarization;
33+
import org.hibernate.sql.ast.tree.predicate.BooleanExpressionPredicate;
3334
import org.hibernate.sql.ast.tree.predicate.SelfRenderingPredicate;
3435
import org.hibernate.sql.ast.tree.select.QueryGroup;
3536
import org.hibernate.sql.ast.tree.select.QueryPart;
@@ -50,6 +51,16 @@ public FirebirdSqlAstTranslator(SessionFactoryImplementor sessionFactory, Statem
5051
super( sessionFactory, statement );
5152
}
5253

54+
@Override
55+
public void visitBooleanExpressionPredicate(BooleanExpressionPredicate booleanExpressionPredicate) {
56+
if ( getDialect().getVersion() >= 300 ) {
57+
booleanExpressionPredicate.getExpression().accept( this );
58+
}
59+
else {
60+
super.visitBooleanExpressionPredicate( booleanExpressionPredicate );
61+
}
62+
}
63+
5364
@Override
5465
protected String getForUpdate() {
5566
return " with lock";

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/InformixDialect.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -168,8 +168,8 @@ public void initializeFunctionRegistry(QueryEngine queryEngine) {
168168
queryEngine.getSqmFunctionRegistry().registerBinaryTernaryPattern(
169169
"locate",
170170
StandardBasicTypes.INTEGER,
171-
"instr(?2, ?1)",
172-
"instr(?2, ?1, ?3)"
171+
"instr(?2,?1)",
172+
"instr(?2,?1,?3)"
173173
).setArgumentListSignature("(pattern, string[, start])");
174174

175175
//coalesce() and nullif() both supported since Informix 12
@@ -307,7 +307,7 @@ public SequenceSupport getSequenceSupport() {
307307

308308
@Override
309309
public String getQuerySequencesString() {
310-
return "select systables.tabname as sequence_name, syssequences.* from syssequences join systables on syssequences.tabid = systables.tabid where tabtype = 'Q'";
310+
return "select systables.tabname as sequence_name,syssequences.* from syssequences join systables on syssequences.tabid=systables.tabid where tabtype='Q'";
311311
}
312312

313313
@Override
@@ -322,7 +322,7 @@ public LimitHandler getLimitHandler() {
322322

323323
@Override
324324
public String getFromDual() {
325-
return "from (select 0 from systables where tabid = 1) as dual";
325+
return "from (select 0 from systables where tabid=1) as dual";
326326
}
327327

328328
@Override

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/InformixSqlAstTranslator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ protected boolean supportsRowValueConstructorSyntaxInQuantifiedPredicates() {
145145

146146
@Override
147147
protected String getFromDual() {
148-
return " from (select 0 from systables where tabid = 1) as dual";
148+
return " from (select 0 from systables where tabid=1) dual";
149149
}
150150

151151
@Override

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/IngresDialect.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -235,15 +235,16 @@ public void initializeFunctionRegistry(QueryEngine queryEngine) {
235235
CommonFunctionFactory.position( queryEngine );
236236
CommonFunctionFactory.format_dateFormat( queryEngine );
237237
CommonFunctionFactory.dateTrunc( queryEngine );
238+
CommonFunctionFactory.bitLength_pattern( queryEngine, "octet_length(hex(?1))*4" );
238239

239240
queryEngine.getSqmFunctionRegistry().registerBinaryTernaryPattern(
240241
"locate",
241242
StandardBasicTypes.INTEGER,
242243
"position(?1 in ?2)",
243-
"(position(?1 in substring(?2 from ?3)) + (?3) - 1)"
244+
"(position(?1 in substring(?2 from ?3))+(?3)-1)"
244245
).setArgumentListSignature("(pattern, string[, start])");
245246

246-
queryEngine.getSqmFunctionRegistry().registerPattern( "extract", "date_part('?1', ?2)", StandardBasicTypes.INTEGER );
247+
queryEngine.getSqmFunctionRegistry().registerPattern( "extract", "date_part('?1',?2)", StandardBasicTypes.INTEGER );
247248

248249
CommonFunctionFactory.bitandorxornot_bitAndOrXorNot(queryEngine);
249250

@@ -290,13 +291,13 @@ protected <T extends JdbcOperation> SqlAstTranslator<T> buildTranslator(
290291

291292
@Override
292293
public String timestampaddPattern(TemporalUnit unit, TemporalType temporalType) {
293-
return "timestampadd(?1, ?2, ?3)";
294+
return "timestampadd(?1,?2,?3)";
294295

295296
}
296297

297298
@Override
298299
public String timestampdiffPattern(TemporalUnit unit, TemporalType fromTemporalType, TemporalType toTemporalType) {
299-
return "timestampdiff(?1, ?2, ?3)";
300+
return "timestampdiff(?1,?2,?3)";
300301
}
301302

302303
@Override

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/IngresSqlAstTranslator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ protected boolean supportsRowValueConstructorSyntaxInQuantifiedPredicates() {
151151
@Override
152152
protected String getFromDual() {
153153
//this is only necessary if the query has a where clause
154-
return " from (select 0) as dual";
154+
return " from (select 0) dual";
155155
}
156156

157157
@Override

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/MaxDBDialect.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ public void initializeFunctionRegistry(QueryEngine queryEngine) {
139139

140140
queryEngine.getSqmFunctionRegistry().registerBinaryTernaryPattern(
141141
"locate",
142-
StandardBasicTypes.INTEGER, "index(?2, ?1)", "index(?2, ?1, ?3)"
142+
StandardBasicTypes.INTEGER, "index(?2,?1)", "index(?2,?1,?3)"
143143
).setArgumentListSignature("(pattern, string[, start])");
144144
}
145145

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/MaxDBSqlAstTranslator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ protected void visitCaseSearchedExpression(CaseSearchedExpression caseSearchedEx
6868
visitDecodeCaseSearchedExpression( caseSearchedExpression );
6969
}
7070
else {
71-
visitAnsiCaseSearchedExpression( caseSearchedExpression );
71+
super.visitCaseSearchedExpression( caseSearchedExpression, inSelect );
7272
}
7373
}
7474

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/MimerSQLDialect.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ public void initializeFunctionRegistry(QueryEngine queryEngine) {
101101

102102
CommonFunctionFactory.soundex( queryEngine );
103103
CommonFunctionFactory.octetLength( queryEngine );
104+
CommonFunctionFactory.bitLength( queryEngine );
104105
CommonFunctionFactory.truncate( queryEngine );
105106
CommonFunctionFactory.repeat( queryEngine );
106107
CommonFunctionFactory.pad_repeat( queryEngine );
@@ -161,7 +162,7 @@ public String extractPattern(TemporalUnit unit) {
161162

162163
public String timestampdiffPattern(TemporalUnit unit, TemporalType fromTemporalType, TemporalType toTemporalType) {
163164
StringBuilder pattern = new StringBuilder();
164-
pattern.append("cast((?3 - ?2) ");
165+
pattern.append("cast((?3-?2) ");
165166
switch (unit) {
166167
case NATIVE:
167168
case NANOSECOND:
@@ -209,13 +210,13 @@ public String timestampaddPattern(TemporalUnit unit, TemporalType temporalType)
209210
switch ( unit ) {
210211
case NATIVE:
211212
case NANOSECOND:
212-
return "(?3 + (?2)/1e9 * interval '1' second)";
213+
return "(?3+(?2)/1e9*interval '1' second)";
213214
case QUARTER:
214-
return "(?3 + (?2) * interval '3' month)";
215+
return "(?3+(?2)*interval '3' month)";
215216
case WEEK:
216-
return "(?3 + (?2) * interval '7' day)";
217+
return "(?3+(?2)*interval '7' day)";
217218
default:
218-
return "(?3 + (?2) * interval '1' ?1)";
219+
return "(?3+(?2)*interval '1' ?1)";
219220
}
220221
}
221222

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/RDMSOS2200Dialect.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -223,23 +223,23 @@ public String extractPattern(TemporalUnit unit) {
223223
public String timestampaddPattern(TemporalUnit unit, TemporalType temporalType) {
224224
switch (unit) {
225225
case NANOSECOND:
226-
return "timestampadd('SQL_TSI_FRAC_SECOND', (?2)/1e3, ?3)";
226+
return "timestampadd('SQL_TSI_FRAC_SECOND',(?2)/1e3,?3)";
227227
case NATIVE:
228-
return "timestampadd('SQL_TSI_FRAC_SECOND', ?2, ?3)";
228+
return "timestampadd('SQL_TSI_FRAC_SECOND',?2,?3)";
229229
default:
230-
return "dateadd('?1', ?2, ?3)";
230+
return "dateadd('?1',?2,?3)";
231231
}
232232
}
233233

234234
@Override
235235
public String timestampdiffPattern(TemporalUnit unit, TemporalType fromTemporalType, TemporalType toTemporalType) {
236236
switch (unit) {
237237
case NANOSECOND:
238-
return "timestampdiff('SQL_TSI_FRAC_SECOND', ?2, ?3)*1e3";
238+
return "timestampdiff('SQL_TSI_FRAC_SECOND',?2,?3)*1e3";
239239
case NATIVE:
240-
return "timestampdiff('SQL_TSI_FRAC_SECOND', ?2, ?3)";
240+
return "timestampdiff('SQL_TSI_FRAC_SECOND',?2,?3)";
241241
default:
242-
return "dateadd('?1', ?2, ?3)";
242+
return "dateadd('?1',?2,?3)";
243243
}
244244
}
245245

@@ -325,7 +325,7 @@ public LimitHandler getLimitHandler() {
325325

326326
@Override
327327
public String getFromDual() {
328-
return "from rdms.rdms_dummy where key_col = 1";
328+
return "from rdms.rdms_dummy where key_col=1";
329329
}
330330

331331
@Override

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/RDMSOS2200SqlAstTranslator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ protected boolean supportsRowValueConstructorSyntaxInQuantifiedPredicates() {
138138

139139
@Override
140140
protected String getFromDual() {
141-
return " from rdms.rdms_dummy where key_col = 1";
141+
return " from rdms.rdms_dummy where key_col=1";
142142
}
143143

144144
@Override

0 commit comments

Comments
 (0)