with two tables query namedquery multiple inner ejemplos create java hibernate jpa join jpql

java - two - Recuperación de múltiples combinaciones en una consulta JPQL



jpql join two tables (3)

Tengo las siguientes entidades:

public class Category { private Integer id; @OneToMany(mappedBy = "parent") private List<Topic> topics; } public class Topic { private Integer id; @OneToMany(mappedBy = "parent") private List<Posts> posts; @ManyToOne @JoinColumn(name = "id") private Category parent; } public class Post { private Integer id; @ManyToOne @JoinColumn(name = "id") private Topic parent; /* Post fields */ }

y quiero obtener todas las categorías con temas unidos y publicaciones unidas usando la consulta de JPQL. Me escribió la consulta como a continuación:

SELECT c FROM Category c JOIN FETCH c.topics t JOIN FETCH t.posts p WHERE ...

Pero tengo el error

org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags

Encontré artículos sobre este error, pero estos solo describen situaciones en las que en una entidad hay dos colecciones a las que unir. Mi problema es un poco diferente y no sé cómo resolverlo.

¿Se puede hacer en una consulta?

Lo siento por mi mal inglés, pero suelo hablar en otros idiomas.


Aquí hay un ejemplo de trabajo de unión compleja y condiciones múltiples:

String query_findByProductDepartmentHospital = "select location from ProductInstallLocation location " + " join location.product prod " + " join location.department dep " + " join location.department.hospital hos " + " where prod.name = :product " + " and dep.name.name = :department " + " and hos.name = :hospital "; @Query(query_findByProductDepartmentHospital) ProductInstallLocation findByProductDepartmentHospital(@Param("product") String productName,@Param("department") String departName, @Param("hospital") String hospitalName);


Puede usar una estrategia de búsqueda de padres e hijos y volver a combinar el árbol de entidades del resultado.

SELECT p FROM Post p JOIN FETCH p.topic t JOIN FETCH t.category c WHERE ...


Una solución es usar @Query y @EntityGraph juntos, como se menciona aquí, use @Query y @EntityGraph juntos