繁体   English   中英

使用复合 Where 子句的低效 JPA 查询

[英]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 子句非常强大。”

然而,在观察日志后,我意识到上面的查询正在做一些奇怪的事情,比如

  1. 生成多个选择而不是一个选择

  2. 在日志中可以看到一些交叉连接

我试图了解我是否正确定义了我的查询,以及复合 Where 确实如此强大,为什么我的查询效率如此低下。

您可以使用以下方法:

Set<Children> findAllByTeacherSchoolCity(String city);

假设您的班级Children有 field Teacher teacherTeacherSchool schoolSchoolString 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM