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