From a98ab519bab7d3faad90ee4b03d2dd385ba49d98 Mon Sep 17 00:00:00 2001 From: Steve Ebersole Date: Thu, 9 Mar 2023 10:00:50 -0600 Subject: [PATCH] HHH-16260 - JdbcParameterRenderer not called with dynamic filters HHH-16256 - JdbcParameterRenderer to have an impact on write operations HHH-16273 - Support for Dialect native JdbcParameterRenderer agroal tests :( --- .../src/test/resources/hibernate.properties | 5 ++- .../AbstractCollectionPersister.java | 6 +-- .../java/org/hibernate/sql/SimpleSelect.java | 41 +++++++++++-------- 3 files changed, 30 insertions(+), 22 deletions(-) diff --git a/hibernate-agroal/src/test/resources/hibernate.properties b/hibernate-agroal/src/test/resources/hibernate.properties index da8399b867..dd62db2f27 100644 --- a/hibernate-agroal/src/test/resources/hibernate.properties +++ b/hibernate-agroal/src/test/resources/hibernate.properties @@ -11,9 +11,12 @@ hibernate.connection.username @jdbc.user@ hibernate.connection.password @jdbc.pass@ hibernate.connection.init_sql @connection.init_sql@ +# some Agroal tests fail with native markers. not sure why yet +hibernate.dialect.native_param_markers=false + hibernate.jdbc.batch_size 10 hibernate.connection.provider_class AgroalConnectionProvider hibernate.agroal.maxSize 2 hibernate.agroal.acquisitionTimeout PT1s -hibernate.agroal.reapTimeout PT10s \ No newline at end of file +hibernate.agroal.reapTimeout PT10s diff --git a/hibernate-core/src/main/java/org/hibernate/persister/collection/AbstractCollectionPersister.java b/hibernate-core/src/main/java/org/hibernate/persister/collection/AbstractCollectionPersister.java index 2ecd50e39a..c6aa22b351 100644 --- a/hibernate-core/src/main/java/org/hibernate/persister/collection/AbstractCollectionPersister.java +++ b/hibernate-core/src/main/java/org/hibernate/persister/collection/AbstractCollectionPersister.java @@ -1021,7 +1021,7 @@ public abstract class AbstractCollectionPersister String selectValue = isIntegerIndexed ? "max(" + getIndexColumnNames()[0] + ") + 1" : // lists, arrays "count(" + getElementColumnNames()[0] + ")"; // sets, maps, bags - return new SimpleSelect( dialect ) + return new SimpleSelect( getFactory() ) .setTableName( getTableName() ) .addCondition( getKeyColumnNames(), "=?" ) .addWhereToken( sqlWhereString ) @@ -1033,7 +1033,7 @@ public abstract class AbstractCollectionPersister if ( !hasIndex() ) { return null; } - return new SimpleSelect( dialect ) + return new SimpleSelect( getFactory() ) .setTableName( getTableName() ) .addCondition( getKeyColumnNames(), "=?" ) .addCondition( getIndexColumnNames(), "=?" ) @@ -1045,7 +1045,7 @@ public abstract class AbstractCollectionPersister protected String generateDetectRowByElementString() { - return new SimpleSelect( dialect ) + return new SimpleSelect( getFactory() ) .setTableName( getTableName() ) .addCondition( getKeyColumnNames(), "=?" ) .addCondition( getElementColumnNames(), "=?" ) diff --git a/hibernate-core/src/main/java/org/hibernate/sql/SimpleSelect.java b/hibernate-core/src/main/java/org/hibernate/sql/SimpleSelect.java index f3b3089b1a..5047a82e9f 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/SimpleSelect.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/SimpleSelect.java @@ -18,6 +18,8 @@ import org.hibernate.Internal; import org.hibernate.LockMode; import org.hibernate.LockOptions; import org.hibernate.dialect.Dialect; +import org.hibernate.engine.spi.SessionFactoryImplementor; +import org.hibernate.sql.ast.spi.JdbcParameterRenderer; /** * A SQL {@code SELECT} statement with no table joins. @@ -26,13 +28,6 @@ import org.hibernate.dialect.Dialect; */ @Internal public class SimpleSelect { - - public SimpleSelect(Dialect dialect) { - this.dialect = dialect; - } - - //private static final Alias DEFAULT_ALIAS = new Alias(10, null); - protected String tableName; protected String orderBy; protected String comment; @@ -43,7 +38,16 @@ public class SimpleSelect { protected LockOptions lockOptions = new LockOptions( LockMode.READ ); + private final SessionFactoryImplementor factory; private final Dialect dialect; + private JdbcParameterRenderer _jdbcParameterRenderer; + + public SimpleSelect(SessionFactoryImplementor factory) { + this.factory = factory; + this.dialect = factory.getJdbcServices().getDialect(); + } + + //private static final Alias DEFAULT_ALIAS = new Alias(10, null); public SimpleSelect addColumns(String[] columnNames, String[] columnAliases) { @@ -100,22 +104,30 @@ public class SimpleSelect { return this; } + /** + * Appends a complete {@linkplain org.hibernate.annotations.Where where} fragment. The {@code token} is added as-is + */ public SimpleSelect addWhereToken(String token) { if (token != null ) { - if (!whereTokens.isEmpty()) { - and(); - } + and(); whereTokens.add( token ); } return this; } private void and() { - if ( whereTokens.size() > 0 ) { + if ( !whereTokens.isEmpty() ) { whereTokens.add( "and" ); } } + private JdbcParameterRenderer jdbcParameterRenderer() { + if ( _jdbcParameterRenderer == null ) { + _jdbcParameterRenderer = factory.getServiceRegistry().getService( JdbcParameterRenderer.class ); + } + return _jdbcParameterRenderer; + } + public SimpleSelect addCondition(String lhs, String op, String rhs) { and(); whereTokens.add( lhs + ' ' + op + ' ' + rhs ); @@ -128,13 +140,6 @@ public class SimpleSelect { return this; } - public SimpleSelect addCondition(String[] lhs, String op, String[] rhs) { - for ( int i = 0; i < lhs.length; i++ ) { - addCondition( lhs[i], op, rhs[i] ); - } - return this; - } - public SimpleSelect addCondition(String[] lhs, String condition) { for ( String lh : lhs ) { if ( lh != null ) {