[英]Inefficient JPA query using compound Where clause
我有一个具有一对多关系的表,如下所示
城市->学校->老师->孩子
我用于从城市检索儿童的 JPQL 如下
@Query("Select c from Children c where c.teacher.school.city=:city")
Set<Children> findChildrenFromCity(@Param("city") City city);
“复合路径表达式使 where 子句非常强大。”
然而,在观察日志后,我意识到上面的查询正在做一些奇怪的事情,比如
生成多个选择而不是一个选择
在日志中可以看到一些交叉连接
我试图了解我是否正确定义了我的查询,以及复合 Where 确实如此强大,为什么我的查询效率如此低下。
您可以使用以下方法:
Set<Children> findAllByTeacherSchoolCity(String city);
假设您的班级Children
有 field Teacher teacher
, Teacher
有School school
, School
有String city
。
如有差异,请在评论中要求澄清。
尝试这个
@Query("Select c from City city join city.schools s join s.teachers t join t.childrens c where city = :city")
Set<Children> findChildrenFromCity(@Param("city") City city);
此查询仅运行一个Select
查询来获取Children
实体。 检查下面提到的日志。
HIBERNATE:SELECT childrens3_.id AS id1_0_,childrens3_.date_created AS date_cre2_0_,childrens3_.date_updated AS date_upd3_0_,childrens3_.NAME AS name4_0_,childrens3_.teacher_id AS Teacher_5_0_FROM city IN school1_0_FROM city JO city1_INNER_CityIN school1_INNER Teachers2_ ON school1_.id = Teachers2_.school_id INNER JOIN childrens3_ ON教师2_.id = childrens3_.teacher_id WHERE city0_.id = ?
现在你有一个n+1
问题。 要解决此类问题,您可以使用join fetch
而不是简单的 join。
如果你想使用查询注释试试这个方法
@Query("Select c from Children c join fetch c.teacher t join fetch t.school s join fetch s.city ct where ct.id = :id")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.