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

时间:2017-05-17 11:02:13

标签: java spring jpa spring-data-jpa

我有一个包含一对多关系的表格如下

  

都市>学校 - >教师 - >儿童

我的JPQL用于从城市中检索孩子,如下所示

<table id="dtb" tableClass="table table-condenced table-striped table-bordered">
    <thead>
        <tr>
            <th data-class="expand">Name</th>
            <th>Position</th>
            <th></th>
        </tr>
    </thead>
</table>

reference here关于 Where子句表示

  

&#34;复合路径表达式使where子句非常强大。&#34;

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

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

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

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

3 个答案:

答案 0 :(得分:2)

您可以使用以下方法:

Set<Children> findAllByTeacherSchoolCity(String city);

假设您的班级Children有字段Teacher teacherTeacherSchool schoolSchoolString city

如果存在差异,请在评论中提出澄清说明。

答案 1 :(得分:1)

试试这个

@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 city0_          INNER JOIN学校1_                  ON city0_.id = schools1_.city_id          INNER JOIN老师2_                  ON schools1_.id = teachers2_.school_id          INNER JOIN儿童儿童3_                  ON teachers2_.id = childrens3_.teacher_id WHERE city0_.id =?

现在你的问题是n+1。要解决此类问题,您可以使用join fetch代替简单连接。

答案 2 :(得分:0)

如果您想使用Query注释,请尝试使用此方法

@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")