如何在JPQL查询中过滤子集合?

时间:2016-11-28 14:45:11

标签: java spring jpa spring-data jpql

我有以下数据库模型:

Category -< ProductCategory >- Product -< Variant

CategoryProduct有多对多的关系,ProductVariant有一对多关系

现在,我需要获取所有包含活动变体的产品的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 )。

2 个答案:

答案 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查询以从表中为您的子级集合获取数据,并且不会为您过滤数据。