Skip to content

Commit c1bfcca

Browse files
committed
TypedQueryReference
1 parent 02db560 commit c1bfcca

File tree

7 files changed

+90
-16
lines changed

7 files changed

+90
-16
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;
@@ -43,12 +38,17 @@
4338
import jakarta.persistence.FlushModeType;
4439
import jakarta.persistence.LockModeType;
4540
import jakarta.persistence.Parameter;
41+
import jakarta.persistence.TypedQueryReference;
4642
import jakarta.persistence.criteria.CriteriaBuilder;
4743
import jakarta.persistence.criteria.CriteriaDelete;
4844
import jakarta.persistence.criteria.CriteriaQuery;
4945
import jakarta.persistence.criteria.CriteriaUpdate;
5046
import jakarta.persistence.metamodel.Attribute;
5147
import jakarta.persistence.metamodel.Metamodel;
48+
import java.lang.invoke.MethodHandles;
49+
import java.util.List;
50+
import java.util.function.BiFunction;
51+
import java.util.function.Function;
5252

5353
import static org.hibernate.engine.internal.ManagedTypeHelper.asPersistentAttributeInterceptable;
5454
import static org.hibernate.engine.internal.ManagedTypeHelper.isPersistentAttributeInterceptable;
@@ -994,6 +994,22 @@ default Uni<Void> lock(Object entity, LockModeType lockModeType) {
994994
*/
995995
MutationQuery createMutationQuery(JpaCriteriaInsert<?> insert);
996996

997+
/**
998+
* Create a typed {@link org.hibernate.query.Query} instance for the given typed query reference.
999+
*
1000+
* @param typedQueryReference the type query reference
1001+
*
1002+
* @return The {@link org.hibernate.query.Query} instance for execution
1003+
*
1004+
* @throws IllegalArgumentException if a query has not been
1005+
* defined with the name of the typed query reference or if
1006+
* the query result is found to not be assignable to
1007+
* result class of the typed query reference
1008+
*
1009+
* @see org.hibernate.query.QueryProducer#createQuery(TypedQueryReference)
1010+
*/
1011+
<R> Query<R> createQuery(TypedQueryReference<R> typedQueryReference);
1012+
9971013
/**
9981014
* Create an instance of {@link Query} for the given HQL/JPQL query
9991015
* 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: 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.util.ArrayList;
910
import java.util.List;
1011
import java.util.concurrent.CompletableFuture;
@@ -830,6 +831,21 @@ public <T> RootGraphImplementor<T> getEntityGraph(Class<T> entity, String name)
830831
return (RootGraphImplementor<T>) entityGraph;
831832
}
832833

834+
@Override
835+
public <R> ReactiveQuery<R> createReactiveQuery(TypedQueryReference<R> typedQueryReference) {
836+
checksBeforeQueryCreation();
837+
@SuppressWarnings("unchecked")
838+
// this cast is fine because of all our impls of TypedQueryReference return Class<R>
839+
final Class<R> resultType = (Class<R>) typedQueryReference.getResultType();
840+
ReactiveQueryImplementor<R> query = (ReactiveQueryImplementor<R>) buildNamedQuery(
841+
typedQueryReference.getName(),
842+
memento -> createSqmQueryImplementor( resultType, memento ),
843+
memento -> createNativeQueryImplementor( resultType, memento )
844+
);
845+
typedQueryReference.getHints().forEach( query::setHint );
846+
return query;
847+
}
848+
833849
@Override
834850
public <R> ReactiveSqmQueryImplementor<R> createReactiveQuery(String queryString) {
835851
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;
@@ -26,6 +27,7 @@
2627
import org.hibernate.proxy.HibernateProxy;
2728
import org.hibernate.query.Order;
2829
import org.hibernate.query.Page;
30+
import org.hibernate.query.Query;
2931
import org.hibernate.query.criteria.HibernateCriteriaBuilder;
3032
import org.hibernate.query.criteria.JpaCriteriaInsert;
3133
import org.hibernate.reactive.common.AffectedEntities;
@@ -885,17 +887,6 @@ default CompletionStage<Void> lock(Object entity, LockModeType lockModeType) {
885887
return lock( entity, convertToLockMode(lockModeType) );
886888
}
887889

888-
// /**
889-
// * Obtain the specified lock level upon the given object, with the given
890-
// * {@link LockOptions}.
891-
// *
892-
// * @param entity a managed persistent instance
893-
// * @param lockOptions the requested {@link LockOptions}
894-
// *
895-
// * @throws IllegalArgumentException if the given instance is not managed
896-
// */
897-
// CompletionStage<Void> lock(Object entity, LockOptions lockOptions);
898-
899890
/**
900891
* Force this session to flush asynchronously. Must be called at the
901892
* end of a unit of work, before committing the transaction and closing
@@ -1028,6 +1019,22 @@ default CompletionStage<Void> lock(Object entity, LockModeType lockModeType) {
10281019
*/
10291020
MutationQuery createMutationQuery(JpaCriteriaInsert<?> insert);
10301021

1022+
/**
1023+
* Create a typed {@link org.hibernate.query.Query} instance for the given typed query reference.
1024+
*
1025+
* @param typedQueryReference the type query reference
1026+
*
1027+
* @return The {@link org.hibernate.query.Query} instance for execution
1028+
*
1029+
* @throws IllegalArgumentException if a query has not been
1030+
* defined with the name of the typed query reference or if
1031+
* the query result is found to not be assignable to
1032+
* result class of the typed query reference
1033+
*
1034+
* @see org.hibernate.query.QueryProducer#createQuery(TypedQueryReference)
1035+
*/
1036+
<R> Query<R> createQuery(TypedQueryReference<R> typedQueryReference);
1037+
10311038
/**
10321039
* Create an instance of {@link Query} for the given HQL/JPQL query
10331040
* 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)