Skip to content

Commit f5988a4

Browse files
committed
[hibernate#2122] add StatelessSession.get() accepting multiple ids
and add missing overloads of Mutiny.StatelessSession.createQuery() Also add tests for Mutiny.StatelessSession which were missing
1 parent beeae17 commit f5988a4

File tree

8 files changed

+396
-4
lines changed

8 files changed

+396
-4
lines changed

hibernate-reactive-core/src/main/java/org/hibernate/reactive/mutiny/Mutiny.java

+33
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import jakarta.persistence.CacheRetrieveMode;
4141
import jakarta.persistence.CacheStoreMode;
4242
import jakarta.persistence.EntityGraph;
43+
import jakarta.persistence.FindOption;
4344
import jakarta.persistence.FlushModeType;
4445
import jakarta.persistence.LockModeType;
4546
import jakarta.persistence.Parameter;
@@ -617,6 +618,8 @@ default <T> Uni<T> find(Class<T> entityClass, Object id, LockModeType lockModeTy
617618
* @param ids the identifiers
618619
*
619620
* @return a list of persistent instances and nulls via a {@code Uni}
621+
*
622+
* @see org.hibernate.Session#findMultiple(Class, List, FindOption...)
620623
*/
621624
<T> Uni<List<T>> find(Class<T> entityClass, Object... ids);
622625

@@ -1569,6 +1572,18 @@ interface StatelessSession extends Closeable {
15691572
*/
15701573
<T> Uni<T> get(Class<T> entityClass, Object id);
15711574

1575+
/**
1576+
* Retrieve multiple rows.
1577+
*
1578+
* @param entityClass The class of the entity to retrieve
1579+
* @param ids The ids of the entities to retrieve
1580+
*
1581+
* @return a list of detached entity instances, via a {@code Uni}
1582+
*
1583+
* @see org.hibernate.StatelessSession#getMultiple(Class, List)
1584+
*/
1585+
<T> Uni<List<T>> get(Class<T> entityClass, Object... ids);
1586+
15721587
/**
15731588
* Retrieve a row, obtaining the specified lock mode.
15741589
*
@@ -1737,6 +1752,24 @@ default <T> Uni<T> get(Class<T> entityClass, Object id, LockModeType lockModeTyp
17371752
*/
17381753
<R> SelectionQuery<R> createQuery(CriteriaQuery<R> criteriaQuery);
17391754

1755+
/**
1756+
* Create an instance of {@link MutationQuery} for the given criteria update.
1757+
*
1758+
* @param criteriaUpdate The {@link CriteriaUpdate}
1759+
*
1760+
* @return The {@link MutationQuery} instance for manipulation and execution
1761+
*/
1762+
<R> MutationQuery createQuery(CriteriaUpdate<R> criteriaUpdate);
1763+
1764+
/**
1765+
* Create an instance of {@link MutationQuery} for the given criteria delete.
1766+
*
1767+
* @param criteriaDelete The {@link CriteriaDelete}
1768+
*
1769+
* @return The {@link MutationQuery} instance for manipulation and execution
1770+
*/
1771+
<R> MutationQuery createQuery(CriteriaDelete<R> criteriaDelete);
1772+
17401773
/**
17411774
* Insert a row.
17421775
*

hibernate-reactive-core/src/main/java/org/hibernate/reactive/mutiny/impl/MutinyStatelessSessionImpl.java

+17
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@
77

88
import io.smallrye.mutiny.Uni;
99
import jakarta.persistence.EntityGraph;
10+
import jakarta.persistence.criteria.CriteriaDelete;
1011
import jakarta.persistence.criteria.CriteriaQuery;
12+
import jakarta.persistence.criteria.CriteriaUpdate;
1113
import org.hibernate.LockMode;
1214
import org.hibernate.graph.spi.RootGraphImplementor;
1315
import org.hibernate.reactive.common.ResultSetMapping;
@@ -53,6 +55,11 @@ public <T> Uni<T> get(Class<T> entityClass, Object id) {
5355
return uni( () -> delegate.reactiveGet( entityClass, id ) );
5456
}
5557

58+
@Override
59+
public <T> Uni<List<T>> get(Class<T> entityClass, Object... ids) {
60+
return uni( () -> delegate.reactiveGet( entityClass, ids ) );
61+
}
62+
5663
@Override
5764
public <T> Uni<T> get(Class<T> entityClass, Object id, LockMode lockMode) {
5865
return uni( () -> delegate.reactiveGet( entityClass, id, lockMode, null ) );
@@ -114,6 +121,16 @@ public <R> SelectionQuery<R> createQuery(CriteriaQuery<R> criteriaQuery) {
114121
return new MutinySelectionQueryImpl<>( delegate.createReactiveQuery( criteriaQuery ), factory );
115122
}
116123

124+
@Override
125+
public <R> Mutiny.MutationQuery createQuery(CriteriaUpdate<R> criteriaUpdate) {
126+
return new MutinyMutationQueryImpl<>( delegate.createReactiveMutationQuery( criteriaUpdate ), factory );
127+
}
128+
129+
@Override
130+
public <R> Mutiny.MutationQuery createQuery(CriteriaDelete<R> criteriaDelete) {
131+
return new MutinyMutationQueryImpl<>( delegate.createReactiveMutationQuery( criteriaDelete ), factory );
132+
}
133+
117134
@Override
118135
public Uni<Void> insert(Object entity) {
119136
return uni( () -> delegate.reactiveInsert( entity ) );

hibernate-reactive-core/src/main/java/org/hibernate/reactive/session/ReactiveStatelessSession.java

+6-2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
import org.hibernate.reactive.engine.spi.ReactiveSharedSessionContractImplementor;
1111

1212
import jakarta.persistence.EntityGraph;
13+
14+
import java.util.List;
1315
import java.util.concurrent.CompletableFuture;
1416
import java.util.concurrent.CompletionStage;
1517

@@ -26,11 +28,13 @@
2628
@Incubating
2729
public interface ReactiveStatelessSession extends ReactiveQueryProducer, ReactiveSharedSessionContractImplementor {
2830

29-
<T> CompletionStage<T> reactiveGet(Class<? extends T> entityClass, Object id);
31+
<T> CompletionStage<T> reactiveGet(Class<T> entityClass, Object id);
32+
33+
<T> CompletionStage<List<T>> reactiveGet(Class<T> entityClass, Object... id);
3034

3135
<T> CompletionStage<T> reactiveGet(String entityName, Object id);
3236

33-
<T> CompletionStage<T> reactiveGet(Class<? extends T> entityClass, Object id, LockMode lockMode, EntityGraph<T> fetchGraph);
37+
<T> CompletionStage<T> reactiveGet(Class<T> entityClass, Object id, LockMode lockMode, EntityGraph<T> fetchGraph);
3438

3539
<T> CompletionStage<T> reactiveGet(String entityName, Object id, LockMode lockMode, EntityGraph<T> fetchGraph);
3640

hibernate-reactive-core/src/main/java/org/hibernate/reactive/session/impl/ReactiveStatelessSessionImpl.java

+35-2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
*/
66
package org.hibernate.reactive.session.impl;
77

8+
import java.util.ArrayList;
9+
import java.util.List;
810
import java.util.concurrent.CompletableFuture;
911
import java.util.concurrent.CompletionStage;
1012
import java.util.function.Supplier;
@@ -46,6 +48,8 @@
4648
import org.hibernate.proxy.LazyInitializer;
4749
import org.hibernate.query.IllegalMutationQueryException;
4850
import org.hibernate.query.criteria.JpaCriteriaInsert;
51+
import org.hibernate.query.criteria.JpaCriteriaQuery;
52+
import org.hibernate.query.criteria.JpaRoot;
4953
import org.hibernate.query.hql.spi.SqmQueryImplementor;
5054
import org.hibernate.query.named.NamedResultSetMappingMemento;
5155
import org.hibernate.query.spi.HqlInterpretation;
@@ -204,17 +208,46 @@ public void checkTransactionNeededForUpdateOperation(String exceptionMessage) {
204208
}
205209

206210
@Override
207-
public <T> CompletionStage<T> reactiveGet(Class<? extends T> entityClass, Object id) {
211+
public <T> CompletionStage<T> reactiveGet(Class<T> entityClass, Object id) {
208212
return reactiveGet( entityClass.getName(), id, LockMode.NONE, null );
209213
}
210214

215+
@Override
216+
public <T> CompletionStage<List<T>> reactiveGet(Class<T> entityClass, Object... ids) {
217+
checkOpen();
218+
for (Object id : ids) {
219+
if ( id == null ) {
220+
throw new IllegalArgumentException("Null id");
221+
}
222+
}
223+
224+
final EntityPersister persister = getEntityPersister( entityClass.getName() );
225+
226+
final JpaCriteriaQuery<T> query = getCriteriaBuilder().createQuery(entityClass);
227+
final JpaRoot<T> from = query.from(entityClass);
228+
query.where( from.get( persister.getIdentifierPropertyName() ).in(ids) );
229+
return createReactiveQuery(query).getReactiveResultList()
230+
.thenApply( resultList -> {
231+
final List<Object> idList = new ArrayList<>( resultList.size() );
232+
for (T entity : resultList) {
233+
idList.add( persister.getIdentifier(entity, this) );
234+
}
235+
final List<T> list = new ArrayList<>( ids.length );
236+
for (Object id : ids) {
237+
final int pos = idList.indexOf(id);
238+
list.add( pos < 0 ? null : resultList.get(pos) );
239+
}
240+
return list;
241+
});
242+
}
243+
211244
@Override
212245
public <T> CompletionStage<T> reactiveGet(String entityName, Object id) {
213246
return reactiveGet( entityName, id, LockMode.NONE, null );
214247
}
215248

216249
@Override
217-
public <T> CompletionStage<T> reactiveGet(Class<? extends T> entityClass, Object id, LockMode lockMode, EntityGraph<T> fetchGraph) {
250+
public <T> CompletionStage<T> reactiveGet(Class<T> entityClass, Object id, LockMode lockMode, EntityGraph<T> fetchGraph) {
218251
return reactiveGet( entityClass.getName(), id, LockMode.NONE, fetchGraph );
219252
}
220253

hibernate-reactive-core/src/main/java/org/hibernate/reactive/stage/Stage.java

+12
Original file line numberDiff line numberDiff line change
@@ -1604,6 +1604,18 @@ interface StatelessSession extends Closeable {
16041604
*/
16051605
<T> CompletionStage<T> get(Class<T> entityClass, Object id);
16061606

1607+
/**
1608+
* Retrieve multiple rows.
1609+
*
1610+
* @param entityClass The class of the entity to retrieve
1611+
* @param ids The ids of the entities to retrieve
1612+
*
1613+
* @return a list of detached entity instances, via a {@code Uni}
1614+
*
1615+
* @see org.hibernate.StatelessSession#getMultiple(Class, List)
1616+
*/
1617+
<T> CompletionStage<List<T>> get(Class<T> entityClass, Object... ids);
1618+
16071619
/**
16081620
* Retrieve a row, obtaining the specified lock mode.
16091621
*

hibernate-reactive-core/src/main/java/org/hibernate/reactive/stage/impl/StageStatelessSessionImpl.java

+5
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,11 @@ public <T> CompletionStage<T> get(Class<T> entityClass, Object id) {
5050
return delegate.reactiveGet( entityClass, id );
5151
}
5252

53+
@Override
54+
public <T> CompletionStage<List<T>> get(Class<T> entityClass, Object... ids) {
55+
return delegate.reactiveGet( entityClass, ids );
56+
}
57+
5358
@Override
5459
public <T> CompletionStage<T> get(Class<T> entityClass, Object id, LockMode lockMode) {
5560
return delegate.reactiveGet( entityClass, id, lockMode, null );

0 commit comments

Comments
 (0)