diff --git a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/CollectionLoaderBatchKey.java b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/CollectionLoaderBatchKey.java index c629f9a26e..8c869cce54 100644 --- a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/CollectionLoaderBatchKey.java +++ b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/CollectionLoaderBatchKey.java @@ -214,7 +214,8 @@ public Callback getCallback() { return null; } }, - RowTransformerPassThruImpl.instance() + RowTransformerPassThruImpl.instance(), + true ); } diff --git a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/CollectionLoaderSingleKey.java b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/CollectionLoaderSingleKey.java index a4d485ccd3..9c79c339aa 100644 --- a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/CollectionLoaderSingleKey.java +++ b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/CollectionLoaderSingleKey.java @@ -156,7 +156,8 @@ public Callback getCallback() { return null; } }, - RowTransformerPassThruImpl.instance() + RowTransformerPassThruImpl.instance(), + true ); return session.getPersistenceContext().getCollection( collectionKey ); diff --git a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/CollectionLoaderSubSelectFetch.java b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/CollectionLoaderSubSelectFetch.java index 699ea8059c..7b3abe718a 100644 --- a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/CollectionLoaderSubSelectFetch.java +++ b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/CollectionLoaderSubSelectFetch.java @@ -94,7 +94,8 @@ public Callback getCallback() { return null; } }, - RowTransformerPassThruImpl.instance() + RowTransformerPassThruImpl.instance(), + true ); final CollectionKey collectionKey = new CollectionKey( attributeMapping.getCollectionDescriptor(), triggerKey ); diff --git a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/DatabaseSnapshotExecutor.java b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/DatabaseSnapshotExecutor.java index 66014dfef9..54aa69aff7 100644 --- a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/DatabaseSnapshotExecutor.java +++ b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/DatabaseSnapshotExecutor.java @@ -251,7 +251,8 @@ public Callback getCallback() { return null; } }, - RowTransformerPassThruImpl.instance() + RowTransformerPassThruImpl.instance(), + true ); if ( list.isEmpty() ) { diff --git a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/MultiIdEntityLoaderStandardImpl.java b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/MultiIdEntityLoaderStandardImpl.java index cd9d28badd..f6ec7aab0e 100644 --- a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/MultiIdEntityLoaderStandardImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/MultiIdEntityLoaderStandardImpl.java @@ -15,7 +15,6 @@ import org.hibernate.LockMode; import org.hibernate.LockOptions; -import org.hibernate.Session; import org.hibernate.dialect.Dialect; import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; import org.hibernate.engine.jdbc.spi.JdbcServices; @@ -339,7 +338,8 @@ public void registerLoadingEntityEntry(EntityKey entityKey, LoadingEntityEntry e } } }, - RowTransformerPassThruImpl.instance() + RowTransformerPassThruImpl.instance(), + true ); } diff --git a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/NaturalIdLoaderStandardImpl.java b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/NaturalIdLoaderStandardImpl.java index afb0d470b8..95fd19e234 100644 --- a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/NaturalIdLoaderStandardImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/NaturalIdLoaderStandardImpl.java @@ -139,7 +139,8 @@ public Callback getCallback() { }; } }, - row -> (T) row[0] + row -> (T) row[0], + true ); if ( results.size() > 1 ) { @@ -230,7 +231,8 @@ public Callback getCallback() { }; } }, - row -> row + row -> row, + true ); if ( results.size() > 1 ) { @@ -326,7 +328,8 @@ public Callback getCallback() { }; } }, - row -> row + row -> row, + true ); if ( results.size() > 1 ) { diff --git a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/SingleIdEntityLoaderDynamicBatch.java b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/SingleIdEntityLoaderDynamicBatch.java index 9ce278d8f4..e33a082af5 100644 --- a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/SingleIdEntityLoaderDynamicBatch.java +++ b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/SingleIdEntityLoaderDynamicBatch.java @@ -165,7 +165,8 @@ public Callback getCallback() { return null; } }, - RowTransformerPassThruImpl.instance() + RowTransformerPassThruImpl.instance(), + true ); //noinspection ForLoopReplaceableByForEach diff --git a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/SingleIdLoadPlan.java b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/SingleIdLoadPlan.java index 19d589f642..9459993a23 100644 --- a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/SingleIdLoadPlan.java +++ b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/SingleIdLoadPlan.java @@ -150,7 +150,8 @@ public Callback getCallback() { }; } }, - RowTransformerPassThruImpl.instance() + RowTransformerPassThruImpl.instance(), + true ); if ( list.isEmpty() ) { diff --git a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/SingleUniqueKeyEntityLoaderStandard.java b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/SingleUniqueKeyEntityLoaderStandard.java index f6d52365e0..78f07ceead 100644 --- a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/SingleUniqueKeyEntityLoaderStandard.java +++ b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/SingleUniqueKeyEntityLoaderStandard.java @@ -131,7 +131,8 @@ public Callback getCallback() { }; } }, - row -> row[0] + row -> row[0], + true ); assert list.size() == 1; @@ -215,7 +216,8 @@ public Callback getCallback() { }; } }, - row -> row[0] + row -> row[0], + true ); assert list.size() == 1; diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/ConcreteSqmSelectQueryPlan.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/ConcreteSqmSelectQueryPlan.java index 3277febc87..1fa109eb6b 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/ConcreteSqmSelectQueryPlan.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/ConcreteSqmSelectQueryPlan.java @@ -166,7 +166,8 @@ public List performList(ExecutionContext executionContext) { sqmInterpretation.getJdbcSelect(), jdbcParameterBindings, executionContext, - rowTransformer + rowTransformer, + true ); } finally { diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/MatchingIdSelectionHelper.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/MatchingIdSelectionHelper.java index e8dda1ae63..a9e3ad17d9 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/MatchingIdSelectionHelper.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/MatchingIdSelectionHelper.java @@ -226,7 +226,8 @@ public static List selectMatchingIds( idSelectJdbcOperation, jdbcParameterBindings, executionContext, - row -> row + row -> row, + true ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/sql/exec/internal/JdbcSelectExecutorStandardImpl.java b/hibernate-core/src/main/java/org/hibernate/sql/exec/internal/JdbcSelectExecutorStandardImpl.java index 35df3b6bb2..ed1aac4e45 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/exec/internal/JdbcSelectExecutorStandardImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/exec/internal/JdbcSelectExecutorStandardImpl.java @@ -64,10 +64,11 @@ public class JdbcSelectExecutorStandardImpl implements JdbcSelectExecutor { @Override public List list( - JdbcSelect jdbcSelect, - JdbcParameterBindings jdbcParameterBindings, - ExecutionContext executionContext, - RowTransformer rowTransformer) { + JdbcSelect jdbcSelect, + JdbcParameterBindings jdbcParameterBindings, + ExecutionContext executionContext, + RowTransformer rowTransformer, + boolean uniqueFilter) { return executeQuery( jdbcSelect, jdbcParameterBindings, @@ -77,7 +78,7 @@ public List list( .getJdbcCoordinator() .getStatementPreparer() .prepareStatement( sql ), - ListResultsConsumer.instance() + ListResultsConsumer.instance(uniqueFilter) ); } diff --git a/hibernate-core/src/main/java/org/hibernate/sql/exec/spi/JdbcSelectExecutor.java b/hibernate-core/src/main/java/org/hibernate/sql/exec/spi/JdbcSelectExecutor.java index abc8417dc5..032977c70e 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/exec/spi/JdbcSelectExecutor.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/exec/spi/JdbcSelectExecutor.java @@ -24,10 +24,11 @@ public interface JdbcSelectExecutor { // todo (6.0) : Ideally we'd have a singular place (JdbcServices? ServiceRegistry?) to obtain these executors List list( - JdbcSelect jdbcSelect, - JdbcParameterBindings jdbcParameterBindings, - ExecutionContext executionContext, - RowTransformer rowTransformer); + JdbcSelect jdbcSelect, + JdbcParameterBindings jdbcParameterBindings, + ExecutionContext executionContext, + RowTransformer rowTransformer, + boolean uniqueFilter); ScrollableResultsImplementor scroll( JdbcSelect jdbcSelect, diff --git a/hibernate-core/src/main/java/org/hibernate/sql/results/spi/ListResultsConsumer.java b/hibernate-core/src/main/java/org/hibernate/sql/results/spi/ListResultsConsumer.java index 3f84949f45..2463334324 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/results/spi/ListResultsConsumer.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/results/spi/ListResultsConsumer.java @@ -24,11 +24,18 @@ public class ListResultsConsumer implements ResultsConsumer, R> { /** * Singleton access */ - public static final ListResultsConsumer INSTANCE = new ListResultsConsumer(); + private static final ListResultsConsumer UNIQUE_FILTER_INSTANCE = new ListResultsConsumer(true); + private static final ListResultsConsumer NORMAL_INSTANCE = new ListResultsConsumer(false); @SuppressWarnings("unchecked") - public static ListResultsConsumer instance() { - return INSTANCE; + public static ListResultsConsumer instance(boolean uniqueFilter) { + return uniqueFilter ? UNIQUE_FILTER_INSTANCE : NORMAL_INSTANCE; + } + + private final boolean uniqueFilter; + + public ListResultsConsumer(boolean uniqueFilter) { + this.uniqueFilter = uniqueFilter; } @Override @@ -44,7 +51,7 @@ public List consume( boolean uniqueRows = false; final Class resultJavaType = rowReader.getResultJavaType(); - if ( resultJavaType != null && ! resultJavaType.isArray() ) { + if ( uniqueFilter && resultJavaType != null && ! resultJavaType.isArray() ) { final EntityPersister entityDescriptor = session.getFactory().getMetamodel().findEntityDescriptor( resultJavaType ); if ( entityDescriptor != null ) { uniqueRows = true;