Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -586,6 +586,11 @@ public <R> SelectionQuery<R> createSelectionQuery(String hqlString, Class<R> res
return queryDelegate().createSelectionQuery( hqlString, resultType );
}

@Override
public <R> SelectionQuery<R> createSelectionQuery(String hqlString, EntityGraph<R> resultGraph) {
return queryDelegate().createSelectionQuery( hqlString, resultGraph );
}

@Override
public <R> SelectionQuery<R> createSelectionQuery(CriteriaQuery<R> criteria) {
return queryDelegate().createSelectionQuery( criteria );
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -699,6 +699,11 @@ public <R> SelectionQuery<R> createSelectionQuery(String hqlString, Class<R> res
return this.lazySession.get().createSelectionQuery( hqlString, resultType );
}

@Override
public <R> SelectionQuery<R> createSelectionQuery(String hqlString, EntityGraph<R> resultGraph) {
return this.lazySession.get().createSelectionQuery( hqlString, resultGraph );
}

@Override
public <R> SelectionQuery<R> createSelectionQuery(CriteriaQuery<R> criteria) {
return this.lazySession.get().createSelectionQuery( criteria );
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,11 @@ public <R> SelectionQuery<R> createSelectionQuery(String hqlString, Class<R> res
return queryDelegate().createSelectionQuery( hqlString, resultType );
}

@Override
public <R> SelectionQuery<R> createSelectionQuery(String hqlString, EntityGraph<R> resultGraph) {
return queryDelegate().createSelectionQuery( hqlString, resultGraph );
}

@Override
public <R> SelectionQuery<R> createSelectionQuery(CriteriaQuery<R> criteria) {
return queryDelegate().createSelectionQuery( criteria );
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.engine.transaction.internal.TransactionImpl;
import org.hibernate.event.monitor.spi.EventMonitor;
import org.hibernate.graph.GraphSemantic;
import org.hibernate.graph.RootGraph;
import org.hibernate.graph.internal.RootGraphImpl;
import org.hibernate.graph.spi.RootGraphImplementor;
Expand Down Expand Up @@ -877,6 +878,13 @@ public <R> SelectionQuery<R> createSelectionQuery(String hqlString, Class<R> exp
return interpretAndCreateSelectionQuery( hqlString, expectedResultType );
}

@Override
public <R> SelectionQuery<R> createSelectionQuery(String hqlString, EntityGraph<R> resultGraph) {
final RootGraph<R> rootGraph = (RootGraph<R>) resultGraph;
return interpretAndCreateSelectionQuery( hqlString, rootGraph.getGraphedType().getJavaType() )
.setEntityGraph( resultGraph, GraphSemantic.LOAD );
}


@Override
public <R> SelectionQuery<R> createSelectionQuery(CriteriaQuery<R> criteria) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
*/
package org.hibernate.query;

import jakarta.persistence.EntityGraph;
import org.hibernate.query.criteria.JpaCriteriaInsert;

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

/**
* Create a {@link SelectionQuery} instance for the given HQL query
* string and given {@link EntityGraph}, which is interpreted as a
* {@linkplain org.hibernate.graph.GraphSemantic#LOAD load graph}.
* The query result type is the root entity of the given graph.
* <ul>
* <li>If the query has an explicit {@code select} clause, there must
* be a single item in the {@code select} list, and the select
* item must be assignable to the root type of the given graph.
* <li>Otherwise, if a query has no explicit {@code select} list, the
* select list is inferred from the given entity graph. The query
* must have exactly one root entity in the {@code from} clause,
* it must be assignable to the root type of the given graph, and
* the inferred select list will contain just that entity.
* </ul>
* <p>
* If a query has no explicit {@code from} clause, and the given
* result type is an entity type, the root entity is inferred to
* be the result type.
* <p>
* The returned {@code Query} may be executed by calling
* {@link Query#getResultList()} or {@link Query#getSingleResult()}.

* @param hqlString The HQL {@code select} query as a string
* @param resultGraph An {@link EntityGraph} whose root type is the
* query result type, which is interpreted as a
* {@linkplain org.hibernate.graph.GraphSemantic#LOAD
* load graph}
*
* @see jakarta.persistence.EntityManager#createQuery(String)
*
* @throws IllegalSelectQueryException if the given HQL query
* is an {@code insert}, {@code update} or {@code delete}
* statement
*/
<R> SelectionQuery<R> createSelectionQuery(String hqlString, EntityGraph<R> resultGraph);

/**
* Create a {@link SelectionQuery} reference for the given
* {@link CriteriaQuery}.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,45 @@ public class NewGraphTest {
assertTrue( isInitialized( ee.f ) );
}

@Test void testSelectionQuery(SessionFactoryScope scope) {
scope.inTransaction( s-> {
G g = new G();
F f = new F();
E e = new E();
f.g = g;
e.f = f;
s.persist(g);
s.persist(f);
s.persist(e);
});

F f = scope.fromSession(s ->
s.createSelectionQuery("from F where id = 1", F.class)
.getSingleResult());
assertFalse( isInitialized( f.g ) );
assertFalse( isInitialized( f.es ) );
F ff = scope.fromSession(s -> {
RootGraph<F> graph = s.createEntityGraph(F.class);
graph.addAttributeNodes("g", "es");
return s.createSelectionQuery("from F where id = 1", graph)
.getSingleResult();
});
assertTrue( isInitialized( ff.g ) );
assertTrue( isInitialized( ff.es ) );

E e = scope.fromSession(s ->
s.createSelectionQuery("from E where id = 1", E.class)
.getSingleResult());
assertFalse( isInitialized( e.f ) );
E ee = scope.fromSession(s -> {
RootGraph<E> graph = s.createEntityGraph(E.class);
graph.addAttributeNodes("f");
return s.createSelectionQuery("from E where id = 1", graph)
.getSingleResult();
});
assertTrue( isInitialized( ee.f ) );
}

@Entity(name = "E")
static class E {
@Id @GeneratedValue
Expand Down
Loading