簡體   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