Skip to content

Commit db3f1f3

Browse files
committed
HHH-19296 overload createSelectionQuery() to accept an EntityGraph instead of a result class
1 parent 2bc4a94 commit db3f1f3

File tree

6 files changed

+100
-0
lines changed

6 files changed

+100
-0
lines changed

hibernate-core/src/main/java/org/hibernate/engine/spi/SessionDelegatorBaseImpl.java

+5
Original file line numberDiff line numberDiff line change
@@ -586,6 +586,11 @@ public <R> SelectionQuery<R> createSelectionQuery(String hqlString, Class<R> res
586586
return queryDelegate().createSelectionQuery( hqlString, resultType );
587587
}
588588

589+
@Override
590+
public <R> SelectionQuery<R> createSelectionQuery(String hqlString, EntityGraph<R> resultGraph) {
591+
return queryDelegate().createSelectionQuery( hqlString, resultGraph );
592+
}
593+
589594
@Override
590595
public <R> SelectionQuery<R> createSelectionQuery(CriteriaQuery<R> criteria) {
591596
return queryDelegate().createSelectionQuery( criteria );

hibernate-core/src/main/java/org/hibernate/engine/spi/SessionLazyDelegator.java

+5
Original file line numberDiff line numberDiff line change
@@ -699,6 +699,11 @@ public <R> SelectionQuery<R> createSelectionQuery(String hqlString, Class<R> res
699699
return this.lazySession.get().createSelectionQuery( hqlString, resultType );
700700
}
701701

702+
@Override
703+
public <R> SelectionQuery<R> createSelectionQuery(String hqlString, EntityGraph<R> resultGraph) {
704+
return this.lazySession.get().createSelectionQuery( hqlString, resultGraph );
705+
}
706+
702707
@Override
703708
public <R> SelectionQuery<R> createSelectionQuery(CriteriaQuery<R> criteria) {
704709
return this.lazySession.get().createSelectionQuery( criteria );

hibernate-core/src/main/java/org/hibernate/engine/spi/SharedSessionDelegatorBaseImpl.java

+5
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,11 @@ public <R> SelectionQuery<R> createSelectionQuery(String hqlString, Class<R> res
147147
return queryDelegate().createSelectionQuery( hqlString, resultType );
148148
}
149149

150+
@Override
151+
public <R> SelectionQuery<R> createSelectionQuery(String hqlString, EntityGraph<R> resultGraph) {
152+
return queryDelegate().createSelectionQuery( hqlString, resultGraph );
153+
}
154+
150155
@Override
151156
public <R> SelectionQuery<R> createSelectionQuery(CriteriaQuery<R> criteria) {
152157
return queryDelegate().createSelectionQuery( criteria );

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

+8
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
import org.hibernate.engine.spi.SharedSessionContractImplementor;
5050
import org.hibernate.engine.transaction.internal.TransactionImpl;
5151
import org.hibernate.event.monitor.spi.EventMonitor;
52+
import org.hibernate.graph.GraphSemantic;
5253
import org.hibernate.graph.RootGraph;
5354
import org.hibernate.graph.internal.RootGraphImpl;
5455
import org.hibernate.graph.spi.RootGraphImplementor;
@@ -877,6 +878,13 @@ public <R> SelectionQuery<R> createSelectionQuery(String hqlString, Class<R> exp
877878
return interpretAndCreateSelectionQuery( hqlString, expectedResultType );
878879
}
879880

881+
@Override
882+
public <R> SelectionQuery<R> createSelectionQuery(String hqlString, EntityGraph<R> resultGraph) {
883+
final RootGraph<R> rootGraph = (RootGraph<R>) resultGraph;
884+
return interpretAndCreateSelectionQuery( hqlString, rootGraph.getGraphedType().getJavaType() )
885+
.setEntityGraph( resultGraph, GraphSemantic.LOAD );
886+
}
887+
880888

881889
@Override
882890
public <R> SelectionQuery<R> createSelectionQuery(CriteriaQuery<R> criteria) {

hibernate-core/src/main/java/org/hibernate/query/QueryProducer.java

+38
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
*/
55
package org.hibernate.query;
66

7+
import jakarta.persistence.EntityGraph;
78
import org.hibernate.query.criteria.JpaCriteriaInsert;
89

910
import jakarta.persistence.TypedQueryReference;
@@ -337,6 +338,43 @@ public interface QueryProducer {
337338
*/
338339
<R> SelectionQuery<R> createSelectionQuery(String hqlString, Class<R> resultType);
339340

341+
/**
342+
* Create a {@link SelectionQuery} instance for the given HQL query
343+
* string and given {@link EntityGraph}, which is interpreted as a
344+
* {@linkplain org.hibernate.graph.GraphSemantic#LOAD load graph}.
345+
* The query result type is the root entity of the given graph.
346+
* <ul>
347+
* <li>If the query has an explicit {@code select} clause, there must
348+
* be a single item in the {@code select} list, and the select
349+
* item must be assignable to the root type of the given graph.
350+
* <li>Otherwise, if a query has no explicit {@code select} list, the
351+
* select list is inferred from the given entity graph. The query
352+
* must have exactly one root entity in the {@code from} clause,
353+
* it must be assignable to the root type of the given graph, and
354+
* the inferred select list will contain just that entity.
355+
* </ul>
356+
* <p>
357+
* If a query has no explicit {@code from} clause, and the given
358+
* result type is an entity type, the root entity is inferred to
359+
* be the result type.
360+
* <p>
361+
* The returned {@code Query} may be executed by calling
362+
* {@link Query#getResultList()} or {@link Query#getSingleResult()}.
363+
364+
* @param hqlString The HQL {@code select} query as a string
365+
* @param resultGraph An {@link EntityGraph} whose root type is the
366+
* query result type, which is interpreted as a
367+
* {@linkplain org.hibernate.graph.GraphSemantic#LOAD
368+
* load graph}
369+
*
370+
* @see jakarta.persistence.EntityManager#createQuery(String)
371+
*
372+
* @throws IllegalSelectQueryException if the given HQL query
373+
* is an {@code insert}, {@code update} or {@code delete}
374+
* statement
375+
*/
376+
<R> SelectionQuery<R> createSelectionQuery(String hqlString, EntityGraph<R> resultGraph);
377+
340378
/**
341379
* Create a {@link SelectionQuery} reference for the given
342380
* {@link CriteriaQuery}.

hibernate-core/src/test/java/org/hibernate/orm/test/annotations/fetchprofile/NewGraphTest.java

+39
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,45 @@ public class NewGraphTest {
168168
assertTrue( isInitialized( ee.f ) );
169169
}
170170

171+
@Test void testSelectionQuery(SessionFactoryScope scope) {
172+
scope.inTransaction( s-> {
173+
G g = new G();
174+
F f = new F();
175+
E e = new E();
176+
f.g = g;
177+
e.f = f;
178+
s.persist(g);
179+
s.persist(f);
180+
s.persist(e);
181+
});
182+
183+
F f = scope.fromSession(s ->
184+
s.createSelectionQuery("from F where id = 1", F.class)
185+
.getSingleResult());
186+
assertFalse( isInitialized( f.g ) );
187+
assertFalse( isInitialized( f.es ) );
188+
F ff = scope.fromSession(s -> {
189+
RootGraph<F> graph = s.createEntityGraph(F.class);
190+
graph.addAttributeNodes("g", "es");
191+
return s.createSelectionQuery("from F where id = 1", graph)
192+
.getSingleResult();
193+
});
194+
assertTrue( isInitialized( ff.g ) );
195+
assertTrue( isInitialized( ff.es ) );
196+
197+
E e = scope.fromSession(s ->
198+
s.createSelectionQuery("from E where id = 1", E.class)
199+
.getSingleResult());
200+
assertFalse( isInitialized( e.f ) );
201+
E ee = scope.fromSession(s -> {
202+
RootGraph<E> graph = s.createEntityGraph(E.class);
203+
graph.addAttributeNodes("f");
204+
return s.createSelectionQuery("from E where id = 1", graph)
205+
.getSingleResult();
206+
});
207+
assertTrue( isInitialized( ee.f ) );
208+
}
209+
171210
@Entity(name = "E")
172211
static class E {
173212
@Id @GeneratedValue

0 commit comments

Comments
 (0)