[英]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.