Skip to content

Commit 4906b17

Browse files
committed
TypedQueryReference
1 parent efe4621 commit 4906b17

File tree

8 files changed

+345
-182
lines changed

8 files changed

+345
-182
lines changed

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

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,6 @@
55
*/
66
package org.hibernate.reactive.mutiny;
77

8-
import java.lang.invoke.MethodHandles;
9-
import java.util.List;
10-
import java.util.function.BiFunction;
11-
import java.util.function.Function;
12-
138
import org.hibernate.Cache;
149
import org.hibernate.CacheMode;
1510
import org.hibernate.Filter;
@@ -42,12 +37,17 @@
4237
import jakarta.persistence.FlushModeType;
4338
import jakarta.persistence.LockModeType;
4439
import jakarta.persistence.Parameter;
40+
import jakarta.persistence.TypedQueryReference;
4541
import jakarta.persistence.criteria.CriteriaBuilder;
4642
import jakarta.persistence.criteria.CriteriaDelete;
4743
import jakarta.persistence.criteria.CriteriaQuery;
4844
import jakarta.persistence.criteria.CriteriaUpdate;
4945
import jakarta.persistence.metamodel.Attribute;
5046
import jakarta.persistence.metamodel.Metamodel;
47+
import java.lang.invoke.MethodHandles;
48+
import java.util.List;
49+
import java.util.function.BiFunction;
50+
import java.util.function.Function;
5151

5252
import static org.hibernate.engine.internal.ManagedTypeHelper.asPersistentAttributeInterceptable;
5353
import static org.hibernate.engine.internal.ManagedTypeHelper.isPersistentAttributeInterceptable;
@@ -962,6 +962,22 @@ default Uni<Void> lock(Object entity, LockModeType lockModeType) {
962962
*/
963963
MutationQuery createMutationQuery(JpaCriteriaInsert<?> insert);
964964

965+
/**
966+
* Create a typed {@link org.hibernate.query.Query} instance for the given typed query reference.
967+
*
968+
* @param typedQueryReference the type query reference
969+
*
970+
* @return The {@link org.hibernate.query.Query} instance for execution
971+
*
972+
* @throws IllegalArgumentException if a query has not been
973+
* defined with the name of the typed query reference or if
974+
* the query result is found to not be assignable to
975+
* result class of the typed query reference
976+
*
977+
* @see org.hibernate.query.QueryProducer#createQuery(TypedQueryReference)
978+
*/
979+
<R> Query<R> createQuery(TypedQueryReference<R> typedQueryReference);
980+
965981
/**
966982
* Create an instance of {@link Query} for the given HQL/JPQL query
967983
* string or HQL/JPQL update or delete statement. In the case of an

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import jakarta.persistence.FlushModeType;
1313
import jakarta.persistence.LockModeType;
1414
import jakarta.persistence.PersistenceException;
15+
import jakarta.persistence.TypedQueryReference;
1516
import jakarta.persistence.criteria.CriteriaDelete;
1617
import jakarta.persistence.criteria.CriteriaQuery;
1718
import jakarta.persistence.criteria.CriteriaUpdate;
@@ -34,6 +35,7 @@
3435
import org.hibernate.reactive.mutiny.Mutiny.Query;
3536
import org.hibernate.reactive.mutiny.Mutiny.SelectionQuery;
3637
import org.hibernate.reactive.pool.ReactiveConnection;
38+
import org.hibernate.reactive.query.ReactiveQuery;
3739
import org.hibernate.reactive.session.ReactiveConnectionSupplier;
3840
import org.hibernate.reactive.session.ReactiveQueryProducer;
3941
import org.hibernate.reactive.session.ReactiveSession;
@@ -140,6 +142,12 @@ public MutationQuery createMutationQuery(JpaCriteriaInsert<?> insert) {
140142
return new MutinyMutationQueryImpl<>( delegate.createReactiveMutationQuery( insert ), factory );
141143
}
142144

145+
@Override
146+
public <R> Query<R> createQuery(TypedQueryReference<R> typedQueryReference) {
147+
ReactiveQuery<R> reactiveQuery = delegate.createReactiveQuery( typedQueryReference );
148+
return new MutinyQueryImpl<>( reactiveQuery, factory );
149+
}
150+
143151
@Override @Deprecated
144152
public <R> Query<R> createQuery(String queryString) {
145153
return new MutinyQueryImpl<>( delegate.createReactiveQuery( queryString ), factory );

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
*/
66
package org.hibernate.reactive.session;
77

8+
import jakarta.persistence.TypedQueryReference;
89
import java.util.concurrent.CompletionStage;
910

1011
import org.hibernate.Incubating;
@@ -53,6 +54,8 @@ public interface ReactiveQueryProducer extends ReactiveConnectionSupplier {
5354

5455
<R> ReactiveQuery<R> createReactiveQuery(String queryString);
5556

57+
<R> ReactiveQuery<R> createReactiveQuery(TypedQueryReference<R> typedQueryReference);
58+
5659
<R> ReactiveQuery<R> createReactiveQuery(CriteriaQuery<R> criteriaQuery);
5760

5861
<R> ReactiveQuery<R> createReactiveQuery(String queryString, Class<R> resultType);

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
*/
66
package org.hibernate.reactive.session.impl;
77

8+
import jakarta.persistence.TypedQueryReference;
89
import java.lang.invoke.MethodHandles;
910
import java.util.List;
1011
import java.util.Map;
@@ -357,6 +358,21 @@ protected <T> ReactiveQueryImplementor<T> createReactiveCriteriaQuery(SqmStateme
357358
return query;
358359
}
359360

361+
@Override
362+
public <R> ReactiveQuery<R> createReactiveQuery(TypedQueryReference<R> typedQueryReference) {
363+
checksBeforeQueryCreation();
364+
@SuppressWarnings("unchecked")
365+
// this cast is fine because of all our impls of TypedQueryReference return Class<R>
366+
final Class<R> resultType = (Class<R>) typedQueryReference.getResultType();
367+
ReactiveQueryImplementor<R> query = (ReactiveQueryImplementor<R>) buildNamedQuery(
368+
typedQueryReference.getName(),
369+
memento -> createSqmQueryImplementor( resultType, memento ),
370+
memento -> createNativeQueryImplementor( resultType, memento )
371+
);
372+
typedQueryReference.getHints().forEach( query::setHint );
373+
return query;
374+
}
375+
360376
@Override
361377
public <R> ReactiveQuery<R> createReactiveQuery(String queryString) {
362378
return createReactiveQuery( queryString, null );

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

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,13 @@
55
*/
66
package org.hibernate.reactive.session.impl;
77

8+
import jakarta.persistence.TypedQueryReference;
9+
import java.util.ArrayList;
10+
import java.util.List;
11+
import java.util.concurrent.CompletableFuture;
12+
import java.util.concurrent.CompletionStage;
13+
import java.util.function.Supplier;
14+
815
import org.hibernate.HibernateException;
916
import org.hibernate.LockMode;
1017
import org.hibernate.LockOptions;
@@ -793,6 +800,21 @@ public <T> RootGraphImplementor<T> getEntityGraph(Class<T> entity, String name)
793800
return (RootGraphImplementor<T>) entityGraph;
794801
}
795802

803+
@Override
804+
public <R> ReactiveQuery<R> createReactiveQuery(TypedQueryReference<R> typedQueryReference) {
805+
checksBeforeQueryCreation();
806+
@SuppressWarnings("unchecked")
807+
// this cast is fine because of all our impls of TypedQueryReference return Class<R>
808+
final Class<R> resultType = (Class<R>) typedQueryReference.getResultType();
809+
ReactiveQueryImplementor<R> query = (ReactiveQueryImplementor<R>) buildNamedQuery(
810+
typedQueryReference.getName(),
811+
memento -> createSqmQueryImplementor( resultType, memento ),
812+
memento -> createNativeQueryImplementor( resultType, memento )
813+
);
814+
typedQueryReference.getHints().forEach( query::setHint );
815+
return query;
816+
}
817+
796818
@Override
797819
public <R> ReactiveSqmQueryImplementor<R> createReactiveQuery(String queryString) {
798820
return createReactiveQuery( queryString, null );

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

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
*/
66
package org.hibernate.reactive.stage;
77

8+
import jakarta.persistence.TypedQueryReference;
89
import java.lang.invoke.MethodHandles;
910
import java.util.List;
1011
import java.util.concurrent.CompletionStage;
@@ -25,6 +26,7 @@
2526
import org.hibernate.jpa.internal.util.FlushModeTypeHelper;
2627
import org.hibernate.proxy.HibernateProxy;
2728
import org.hibernate.query.Page;
29+
import org.hibernate.query.Query;
2830
import org.hibernate.query.criteria.HibernateCriteriaBuilder;
2931
import org.hibernate.query.criteria.JpaCriteriaInsert;
3032
import org.hibernate.reactive.common.AffectedEntities;
@@ -853,17 +855,6 @@ default CompletionStage<Void> lock(Object entity, LockModeType lockModeType) {
853855
return lock( entity, convertToLockMode(lockModeType) );
854856
}
855857

856-
// /**
857-
// * Obtain the specified lock level upon the given object, with the given
858-
// * {@link LockOptions}.
859-
// *
860-
// * @param entity a managed persistent instance
861-
// * @param lockOptions the requested {@link LockOptions}
862-
// *
863-
// * @throws IllegalArgumentException if the given instance is not managed
864-
// */
865-
// CompletionStage<Void> lock(Object entity, LockOptions lockOptions);
866-
867858
/**
868859
* Force this session to flush asynchronously. Must be called at the
869860
* end of a unit of work, before committing the transaction and closing
@@ -996,6 +987,22 @@ default CompletionStage<Void> lock(Object entity, LockModeType lockModeType) {
996987
*/
997988
MutationQuery createMutationQuery(JpaCriteriaInsert<?> insert);
998989

990+
/**
991+
* Create a typed {@link org.hibernate.query.Query} instance for the given typed query reference.
992+
*
993+
* @param typedQueryReference the type query reference
994+
*
995+
* @return The {@link org.hibernate.query.Query} instance for execution
996+
*
997+
* @throws IllegalArgumentException if a query has not been
998+
* defined with the name of the typed query reference or if
999+
* the query result is found to not be assignable to
1000+
* result class of the typed query reference
1001+
*
1002+
* @see org.hibernate.query.QueryProducer#createQuery(TypedQueryReference)
1003+
*/
1004+
<R> Query<R> createQuery(TypedQueryReference<R> typedQueryReference);
1005+
9991006
/**
10001007
* Create an instance of {@link Query} for the given HQL/JPQL query
10011008
* string or HQL/JPQL update or delete statement. In the case of an

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
*/
66
package org.hibernate.reactive.stage.impl;
77

8+
import jakarta.persistence.TypedQueryReference;
89
import java.lang.invoke.MethodHandles;
910
import java.util.List;
1011
import java.util.concurrent.CompletionStage;
@@ -26,6 +27,7 @@
2627
import org.hibernate.reactive.logging.impl.Log;
2728
import org.hibernate.reactive.logging.impl.LoggerFactory;
2829
import org.hibernate.reactive.pool.ReactiveConnection;
30+
import org.hibernate.reactive.query.ReactiveQuery;
2931
import org.hibernate.reactive.session.ReactiveConnectionSupplier;
3032
import org.hibernate.reactive.session.ReactiveQueryProducer;
3133
import org.hibernate.reactive.session.ReactiveSession;
@@ -530,6 +532,12 @@ public <T> EntityGraph<T> createEntityGraph(Class<T> rootType, String graphName)
530532
return delegate.createEntityGraph( rootType, graphName );
531533
}
532534

535+
@Override
536+
public <R> Query<R> createQuery(TypedQueryReference<R> typedQueryReference) {
537+
ReactiveQuery<R> reactiveQuery = delegate.createReactiveQuery( typedQueryReference );
538+
return new StageQueryImpl<>( reactiveQuery );
539+
}
540+
533541
@Override @Deprecated
534542
public <R> Query<R> createQuery(String queryString) {
535543
return new StageQueryImpl<>( delegate.createReactiveQuery( queryString ) );

0 commit comments

Comments
 (0)