From febe469f3edb3a435a32047055bba53696333cf2 Mon Sep 17 00:00:00 2001 From: Jan Schatteman Date: Thu, 17 Jul 2025 16:45:01 +0200 Subject: [PATCH] HHH-19261 - query hints in Oracle are not concatenated with comma's, but with spaces Signed-off-by: Jan Schatteman --- .../community/dialect/OracleLegacyDialect.java | 14 ++++++++++++++ .../java/org/hibernate/dialect/OracleDialect.java | 13 +++++++++++++ .../orm/test/queryhint/OracleQueryHintTest.java | 2 +- 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/OracleLegacyDialect.java b/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/OracleLegacyDialect.java index 1b545ae97ff6..9f30dd1341cf 100644 --- a/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/OracleLegacyDialect.java +++ b/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/OracleLegacyDialect.java @@ -11,6 +11,7 @@ import java.sql.Types; import java.time.temporal.ChronoField; import java.time.temporal.TemporalAccessor; +import java.util.List; import java.util.Locale; import java.util.TimeZone; import java.util.regex.Matcher; @@ -119,8 +120,10 @@ import jakarta.persistence.GenerationType; import jakarta.persistence.TemporalType; +import static java.lang.String.join; import static java.util.regex.Pattern.CASE_INSENSITIVE; import static org.hibernate.exception.spi.TemplatedViolatedConstraintNameExtractor.extractUsingTemplate; +import static org.hibernate.internal.util.StringHelper.isEmpty; import static org.hibernate.query.common.TemporalUnit.DAY; import static org.hibernate.query.common.TemporalUnit.HOUR; import static org.hibernate.query.common.TemporalUnit.MINUTE; @@ -1275,6 +1278,17 @@ public boolean useFollowOnLocking(String sql, QueryOptions queryOptions) { ); } + @Override + public String getQueryHintString(String query, List hintList) { + if ( hintList.isEmpty() ) { + return query; + } + else { + final String hints = join( " ", hintList ); + return isEmpty( hints ) ? query : getQueryHintString( query, hints ); + } + } + @Override public String getQueryHintString(String sql, String hints) { final String statementType = statementType( sql ); diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/OracleDialect.java b/hibernate-core/src/main/java/org/hibernate/dialect/OracleDialect.java index c3abaade3337..1dfafcc97685 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/OracleDialect.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/OracleDialect.java @@ -113,10 +113,12 @@ import java.sql.Types; import java.time.temporal.ChronoField; import java.time.temporal.TemporalAccessor; +import java.util.List; import java.util.TimeZone; import java.util.regex.Matcher; import java.util.regex.Pattern; +import static java.lang.String.join; import static java.util.regex.Pattern.CASE_INSENSITIVE; import static org.hibernate.cfg.DialectSpecificSettings.ORACLE_USE_BINARY_FLOATS; import static org.hibernate.dialect.type.OracleJdbcHelper.getArrayJdbcTypeConstructor; @@ -1337,6 +1339,17 @@ public boolean useFollowOnLocking(String sql, QueryOptions queryOptions) { || queryOptions.hasLimit() && queryOptions.getLimit().getFirstRow() != null; } + @Override + public String getQueryHintString(String query, List hintList) { + if ( hintList.isEmpty() ) { + return query; + } + else { + final String hints = join( " ", hintList ); + return isEmpty( hints ) ? query : getQueryHintString( query, hints ); + } + } + @Override public String getQueryHintString(String sql, String hints) { final String statementType = statementType( sql ); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/queryhint/OracleQueryHintTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/queryhint/OracleQueryHintTest.java index 96d3034da77f..84d0f30f4973 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/queryhint/OracleQueryHintTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/queryhint/OracleQueryHintTest.java @@ -94,7 +94,7 @@ public void testQueryHint(SessionFactoryScope scope) { } ); statementInspector.assertExecutedCount( 1 ); - assertTrue( statementInspector.getSqlQueries().get( 0 ).contains( "select /*+ ALL_ROWS, USE_CONCAT */" ) ); + assertTrue( statementInspector.getSqlQueries().get( 0 ).contains( "select /*+ ALL_ROWS USE_CONCAT */" ) ); statementInspector.clear(); // ensure the insertion logic can handle a comment appended to the front