diff --git a/hibernate-core/src/main/java/org/hibernate/engine/query/spi/EntityGraphQueryHint.java b/hibernate-core/src/main/java/org/hibernate/engine/query/spi/EntityGraphQueryHint.java index adf7c66d7f..f505bea452 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/query/spi/EntityGraphQueryHint.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/query/spi/EntityGraphQueryHint.java @@ -7,6 +7,7 @@ package org.hibernate.engine.query.spi; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -52,7 +53,8 @@ public class EntityGraphQueryHint { } return getFromElements( - originEntityGraph.getAttributeNodes(), + fromClause.getLevel() == FromClause.ROOT_LEVEL ? originEntityGraph.getAttributeNodes(): + Collections.emptyList(), fromClause.getFromElement(), fromClause, walker, diff --git a/hibernate-entitymanager/src/test/java/org/hibernate/jpa/test/graphs/queryhint/QueryHintEntityGraphTest.java b/hibernate-entitymanager/src/test/java/org/hibernate/jpa/test/graphs/queryhint/QueryHintEntityGraphTest.java index b253b8b939..4ac5263758 100644 --- a/hibernate-entitymanager/src/test/java/org/hibernate/jpa/test/graphs/queryhint/QueryHintEntityGraphTest.java +++ b/hibernate-entitymanager/src/test/java/org/hibernate/jpa/test/graphs/queryhint/QueryHintEntityGraphTest.java @@ -281,7 +281,7 @@ public class QueryHintEntityGraphTest extends BaseEntityManagerFunctionalTestCas // Ensure the EntityGraph and explicit fetches do not conflict. Query query = entityManager.createQuery( "from " + Company.class.getName() + " as c left join fetch c.location left join fetch c.employees where c.location.zip = :zip") - .setParameter( "zip", 12345 ); + .setParameter("zip", 12345); query.setHint( QueryHints.HINT_LOADGRAPH, entityGraph ); Company company = (Company) query.getSingleResult(); @@ -296,6 +296,22 @@ public class QueryHintEntityGraphTest extends BaseEntityManagerFunctionalTestCas assertTrue( Hibernate.isInitialized( company.phoneNumbers ) ); } + @Test + @TestForIssue(jiraKey = "HHH-9374") + public void testEntityGraphWithCollectionSubquery(){ + EntityManager entityManager = getOrCreateEntityManager(); + entityManager.getTransaction().begin(); + + EntityGraph entityGraph = entityManager.createEntityGraph(Company.class); + entityGraph.addAttributeNodes("location"); + Query query = entityManager.createQuery("select c from " + Company.class.getName() + " c where c.employees IS EMPTY"); + query.setHint(QueryHints.HINT_LOADGRAPH, entityGraph); + query.getResultList(); + + entityManager.getTransaction().commit(); + entityManager.close(); + } + @Before public void createData() { EntityManager entityManager = getOrCreateEntityManager();