我有一个包含一对多关系的表格如下
都市>学校 - >教师 - >儿童
我的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;
然而,在观察日志时,我意识到上面的查询正在做一些奇怪的事情,比如
生成多个选择而不是一个选择
在日志中可以看到一些交叉连接
我试图理解我是否正确定义了我的查询,如果复合Where确实如此强大,为什么我的查询效率低下。
答案 0 :(得分:2)
您可以使用以下方法:
Set<Children> findAllByTeacherSchoolCity(String city);
假设您的班级Children
有字段Teacher teacher
,Teacher
有School school
而School
有String 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")