我有以下数据库模型:
Category -< ProductCategory >- Product -< Variant
(Category
与Product
有多对多的关系,Product
与Variant
有一对多关系
现在,我需要获取所有包含活动变体的产品的Category
条记录。我通过以下JPQL查询获取这些对象:
@Query("select distinct c from Category c join c.products as p join p.variants as pv where pv.active = true")
效果很好 - 准确地返回类别 - 但每个Category
包含所有产品 - 不仅 有效变种。
如何过滤掉单个查询中处于非活动状态的产品(或变体)?
Here是一个带有数据库结构和示例数据的postgres脚本。对于给定数据两个类别( CAT 1 , CAT 2 ),两个产品( PROD 1 , PROD 2 )应返回三个变体( VAR 1 , VAR 2 , VAR 3 )。
答案 0 :(得分:3)
我遇到了完全相同的问题,我花了一段时间才知道这是如何工作的。在FETCH
之后添加JOIN
时,应该过滤子列表:
SELECT DISTINCT c FROM Category c JOIN FETCH c.products as p join p.variants as pv where pv.active = true
答案 1 :(得分:0)
我对此有相同的问题,我发现@OneToMany批注中的FetchType很重要。需要将其设置为惰性模式。如果是Eager模式,jpa将创建sql查询以从表中为您的子级集合获取数据,并且不会为您过滤数据。