Allow to invoke list() operation also without unique filtering

This commit is contained in:
Christian Beikov 2020-01-30 12:20:33 +01:00 committed by Steve Ebersole
parent 7b064afbd3
commit 89ebcfbc32
14 changed files with 50 additions and 28 deletions

View File

@ -214,7 +214,8 @@ public Callback getCallback() {
return null;
}
},
RowTransformerPassThruImpl.instance()
RowTransformerPassThruImpl.instance(),
true
);
}

View File

@ -156,7 +156,8 @@ public Callback getCallback() {
return null;
}
},
RowTransformerPassThruImpl.instance()
RowTransformerPassThruImpl.instance(),
true
);
return session.getPersistenceContext().getCollection( collectionKey );

View File

@ -94,7 +94,8 @@ public Callback getCallback() {
return null;
}
},
RowTransformerPassThruImpl.instance()
RowTransformerPassThruImpl.instance(),
true
);
final CollectionKey collectionKey = new CollectionKey( attributeMapping.getCollectionDescriptor(), triggerKey );

View File

@ -251,7 +251,8 @@ public Callback getCallback() {
return null;
}
},
RowTransformerPassThruImpl.instance()
RowTransformerPassThruImpl.instance(),
true
);
if ( list.isEmpty() ) {

View File

@ -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
);
}

View File

@ -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 ) {

View File

@ -165,7 +165,8 @@ public Callback getCallback() {
return null;
}
},
RowTransformerPassThruImpl.instance()
RowTransformerPassThruImpl.instance(),
true
);
//noinspection ForLoopReplaceableByForEach

View File

@ -150,7 +150,8 @@ public Callback getCallback() {
};
}
},
RowTransformerPassThruImpl.instance()
RowTransformerPassThruImpl.instance(),
true
);
if ( list.isEmpty() ) {

View File

@ -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;

View File

@ -166,7 +166,8 @@ public List<R> performList(ExecutionContext executionContext) {
sqmInterpretation.getJdbcSelect(),
jdbcParameterBindings,
executionContext,
rowTransformer
rowTransformer,
true
);
}
finally {

View File

@ -226,7 +226,8 @@ public static List<Object> selectMatchingIds(
idSelectJdbcOperation,
jdbcParameterBindings,
executionContext,
row -> row
row -> row,
true
);
}
}

View File

@ -64,10 +64,11 @@ public class JdbcSelectExecutorStandardImpl implements JdbcSelectExecutor {
@Override
public <R> List<R> list(
JdbcSelect jdbcSelect,
JdbcParameterBindings jdbcParameterBindings,
ExecutionContext executionContext,
RowTransformer<R> rowTransformer) {
JdbcSelect jdbcSelect,
JdbcParameterBindings jdbcParameterBindings,
ExecutionContext executionContext,
RowTransformer<R> rowTransformer,
boolean uniqueFilter) {
return executeQuery(
jdbcSelect,
jdbcParameterBindings,
@ -77,7 +78,7 @@ public <R> List<R> list(
.getJdbcCoordinator()
.getStatementPreparer()
.prepareStatement( sql ),
ListResultsConsumer.instance()
ListResultsConsumer.instance(uniqueFilter)
);
}

View File

@ -24,10 +24,11 @@ public interface JdbcSelectExecutor {
// todo (6.0) : Ideally we'd have a singular place (JdbcServices? ServiceRegistry?) to obtain these executors
<R> List<R> list(
JdbcSelect jdbcSelect,
JdbcParameterBindings jdbcParameterBindings,
ExecutionContext executionContext,
RowTransformer<R> rowTransformer);
JdbcSelect jdbcSelect,
JdbcParameterBindings jdbcParameterBindings,
ExecutionContext executionContext,
RowTransformer<R> rowTransformer,
boolean uniqueFilter);
<R> ScrollableResultsImplementor<R> scroll(
JdbcSelect jdbcSelect,

View File

@ -24,11 +24,18 @@ public class ListResultsConsumer<R> implements ResultsConsumer<List<R>, 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 <R> ListResultsConsumer<R> instance() {
return INSTANCE;
public static <R> ListResultsConsumer<R> 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<R> consume(
boolean uniqueRows = false;
final Class<R> 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;