【发布时间】:2015-01-30 01:06:53
【问题描述】:
我的查询如下所示:
@Query("SELECT p FROM Pilot p LEFT JOIN FETCH p.playerShips WHERE p.nickname = (:nickname)")
到目前为止一切顺利。即使 playerShips 为空,我也会获得 Pilot 实例。
现在,我想只获取不活跃的船只,所以我修改了我的查询,如下所示:
@Query("SELECT p FROM Pilot p LEFT JOIN FETCH p.playerShips s WHERE p.nickname = (:nickname) AND s.active = false")
而且我作为一名飞行员得到了空值,所以它显然不起作用。
如果有人能解释我如何使用适用于子元素的 WHERE 子句创建 JOIN FETCH 查询,我会很高兴。提前致谢。
【问题讨论】:
-
你的表结构是什么
-
playerShips 表包含布尔值的“活动”列和引用 Pilot.ID 的外键列“pilot_id”,这很重要。
-
选择性地仅检索 ~ToMany 关系的一部分不是一个好主意。你将面临很多问题。而是在代码中进行过滤。除非您想完全忽略整个应用程序中的所有非活动船舶(这就是您的答案所做的)。
-
您能否详细说明您的评论?现在有了我的回答,我正在调用 findByNicknameFetchInactiveShips,它只获取不活动的船只,因此它们根本不会被忽略。此外,仅检索部分 ToMany 可能会导致什么问题?此外,当我使用纯 jpql 时出现错误“with-clause not allowed on fetched associates; use filters”,所以我现在正在做的“使用过滤器”一定是有原因的。我总是有改进的空间,所以我想听听更多关于它的信息。感谢您的评论。
标签: java sql spring spring-data spring-data-jpa