Skip to content

Commit adf7e2c

Browse files
committed
use the MultiIdEntityLoader for SS.getMultiple() instead of Criteria and duplicated logic
1 parent bd92b19 commit adf7e2c

File tree

1 file changed

+80
-40
lines changed

1 file changed

+80
-40
lines changed

hibernate-core/src/main/java/org/hibernate/internal/StatelessSessionImpl.java

Lines changed: 80 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import org.hibernate.engine.spi.EntityKey;
3434
import org.hibernate.engine.spi.LoadQueryInfluencers;
3535
import org.hibernate.engine.spi.PersistenceContext;
36+
import org.hibernate.engine.spi.SessionImplementor;
3637
import org.hibernate.engine.spi.SharedSessionContractImplementor;
3738
import org.hibernate.engine.transaction.internal.jta.JtaStatusHelper;
3839
import org.hibernate.engine.transaction.jta.platform.spi.JtaPlatform;
@@ -75,19 +76,17 @@
7576
import org.hibernate.id.IdentifierGenerationException;
7677
import org.hibernate.loader.ast.internal.LoaderHelper;
7778
import org.hibernate.loader.ast.spi.CascadingFetchProfile;
79+
import org.hibernate.loader.ast.spi.MultiIdLoadOptions;
7880
import org.hibernate.loader.internal.CacheLoadHelper;
7981
import org.hibernate.persister.collection.CollectionPersister;
8082
import org.hibernate.persister.entity.EntityPersister;
8183
import org.hibernate.proxy.LazyInitializer;
82-
import org.hibernate.query.criteria.JpaCriteriaQuery;
83-
import org.hibernate.query.criteria.JpaRoot;
8484
import org.hibernate.stat.spi.StatisticsImplementor;
8585
import org.hibernate.tuple.entity.EntityMetamodel;
8686

8787
import jakarta.persistence.EntityGraph;
8888
import jakarta.transaction.SystemException;
8989

90-
import static java.util.Collections.unmodifiableList;
9190
import static org.hibernate.engine.internal.ManagedTypeHelper.asPersistentAttributeInterceptable;
9291
import static org.hibernate.engine.internal.ManagedTypeHelper.isPersistentAttributeInterceptable;
9392
import static org.hibernate.engine.internal.PersistenceContexts.createPersistenceContext;
@@ -129,6 +128,43 @@
129128
public class StatelessSessionImpl extends AbstractSharedSessionContract implements StatelessSession {
130129
private static final CoreMessageLogger LOG = CoreLogging.messageLogger( StatelessSessionImpl.class );
131130

131+
public static final MultiIdLoadOptions MULTI_ID_LOAD_OPTIONS = new MultiIdLoadOptions() {
132+
@Override
133+
public boolean isSessionCheckingEnabled() {
134+
return false;
135+
}
136+
137+
@Override
138+
public boolean isSecondLevelCacheCheckingEnabled() {
139+
return true;
140+
}
141+
142+
@Override
143+
public Boolean getReadOnly(SessionImplementor session) {
144+
return null;
145+
}
146+
147+
@Override
148+
public boolean isReturnOfDeletedEntitiesEnabled() {
149+
return false;
150+
}
151+
152+
@Override
153+
public boolean isOrderReturnEnabled() {
154+
return true;
155+
}
156+
157+
@Override
158+
public LockOptions getLockOptions() {
159+
return null;
160+
}
161+
162+
@Override
163+
public Integer getBatchSize() {
164+
return null;
165+
}
166+
};
167+
132168
private final LoadQueryInfluencers influencers;
133169
private final PersistenceContext temporaryPersistenceContext;
134170
private final boolean connectionProvided;
@@ -776,43 +812,47 @@ public <T> List<T> getMultiple(Class<T> entityClass, List<?> ids) {
776812

777813
final EntityPersister persister = requireEntityPersister( entityClass.getName() );
778814

779-
final List<Object> uncachedIds;
780-
final List<T> list = new ArrayList<>( ids.size() );
781-
if ( persister.canReadFromCache() ) {
782-
uncachedIds = new ArrayList<>( ids.size() );
783-
for (Object id : ids) {
784-
final Object cachedEntity =
785-
loadFromSecondLevelCache( persister, generateEntityKey( id, persister ), null, LockMode.NONE );
786-
if ( cachedEntity == null ) {
787-
uncachedIds.add( id );
788-
list.add( null );
789-
}
790-
else {
791-
//noinspection unchecked
792-
list.add( (T) cachedEntity );
793-
}
794-
}
795-
}
796-
else {
797-
uncachedIds = unmodifiableList(ids);
798-
for (int i = 0; i < ids.size(); i++) {
799-
list.add( null );
800-
}
801-
}
802-
803-
final JpaCriteriaQuery<T> query = getCriteriaBuilder().createQuery(entityClass);
804-
final JpaRoot<T> from = query.from(entityClass);
805-
query.where( from.get( persister.getIdentifierPropertyName() ).in(uncachedIds) );
806-
final List<T> resultList = createSelectionQuery(query).getResultList();
807-
for (int i = 0; i < ids.size(); i++) {
808-
if ( list.get(i) == null ) {
809-
final Object id = ids.get(i);
810-
list.set( i, resultList.stream()
811-
.filter( entity -> entity != null && persister.getIdentifier( entity, this ).equals(id) )
812-
.findFirst().orElse( null ) );
813-
}
814-
}
815-
return list;
815+
final List<?> results = persister.multiLoad( ids.toArray(), this, MULTI_ID_LOAD_OPTIONS );
816+
//noinspection unchecked
817+
return (List<T>) results;
818+
819+
// final List<Object> uncachedIds;
820+
// final List<T> list = new ArrayList<>( ids.size() );
821+
// if ( persister.canReadFromCache() ) {
822+
// uncachedIds = new ArrayList<>( ids.size() );
823+
// for (Object id : ids) {
824+
// final Object cachedEntity =
825+
// loadFromSecondLevelCache( persister, generateEntityKey( id, persister ), null, LockMode.NONE );
826+
// if ( cachedEntity == null ) {
827+
// uncachedIds.add( id );
828+
// list.add( null );
829+
// }
830+
// else {
831+
// //noinspection unchecked
832+
// list.add( (T) cachedEntity );
833+
// }
834+
// }
835+
// }
836+
// else {
837+
// uncachedIds = unmodifiableList(ids);
838+
// for (int i = 0; i < ids.size(); i++) {
839+
// list.add( null );
840+
// }
841+
// }
842+
//
843+
// final JpaCriteriaQuery<T> query = getCriteriaBuilder().createQuery(entityClass);
844+
// final JpaRoot<T> from = query.from(entityClass);
845+
// query.where( from.get( persister.getIdentifierPropertyName() ).in(uncachedIds) );
846+
// final List<T> resultList = createSelectionQuery(query).getResultList();
847+
// for (int i = 0; i < ids.size(); i++) {
848+
// if ( list.get(i) == null ) {
849+
// final Object id = ids.get(i);
850+
// list.set( i, resultList.stream()
851+
// .filter( entity -> entity != null && persister.getIdentifier( entity, this ).equals(id) )
852+
// .findFirst().orElse( null ) );
853+
// }
854+
// }
855+
// return list;
816856
}
817857

818858
@Override

0 commit comments

Comments
 (0)