集合中集合的 JPQL where 子句

JPQL where clause with collection in collection

我使用 spring 数据...并且我有一个具有 ManyToMany 关系的实体。

所以我想做这样的请求:

@Query("SELECT d FROM Data d WHERE ((?2) IS NULL OR d.categories IN (?2))")

其中 ?2 对应于一个列表,categories 也是来自 Data.

的(另一个实体的)列表

但这行不通...有什么想法吗? :)

PS:我看到一个解决方案:

@Query("SELECT r FROM Data r WHERE (?3 = 0L OR ?3 = (SELECT COUNT(cate.id) FROM Data r2 JOIN r2.categories cate WHERE r.id = r2.id AND cate IN ?2 ))")

但这是休眠生成的糟糕请求,并不是我想要的...

您应该使用两个查询。当参数为空时使用一个来检索所有数据,当参数不为空时使用另一个来检索过滤后的数据。

我认为你应该更好地分解复杂性。 有 java 帮助 :) containtAll() 方法对您没有帮助吗?

P.S:Hibernate 是否理解 (?2) IS NULL 并且适合您?

看看这是否有效

@Query("SELECT DISTINCT(d) FROM Data d JOIN d.categories c 
WHERE (COALESCE(?2, NULL) IS NULL OR c.id IN (?2))")
  1. 这里我假设id是类别table中的主键字段。大家可以根据自己的情况修改。
  2. 您将在此处将类别 ID 列表作为参数传递。

以上查询将从数据 table 中检索所有记录,如果 ?2 为 null 其他,它将根据您将作为 ?2 传递的类别 ID 列表进行过滤。