2017-09-03 78 views
0

我使用spring数据...并且我有一个具有ManyToMany关系的实体。JPQL where子句与集合中的集合

所以我想要做这样的要求:

@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))") 

但它是由Hibernate生成一个蹩脚的请求,不正是我想要的......

回答

0

看看这个工程

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

上面的查询将从数据表中检索所有记录,如果?2为空,那么它将根据您将传递的类别ID列表进行过滤。

+0

@JMA我已经测试了上面的代码,并且它正在使用JPA 2.1 – muasif80

+0

Thx作为您的答案...但是我现在需要添加一些复杂性!事实上,我通过JpaSort.unsafe动态地使用“order by”弹簧。使用不安全的方法,因为我需要对计算值进行排序(例如:SIZE(d.saws),其中d.saws也是一个集合),因此明显不起作用^^ – JMA

0

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

+0

@Query(“SELECT d FROM Data d WHERE d.categories IN(?2))not working :) – JMA

+0

不应该使用(?2)吗????此外,为什么你要从2? – alirabiee

+0

它只是因为它的一个例子...它不是直接我的代码:) sry ^^ – JMA

0

我认为你应该更好地分裂复杂性。 有一个java帮助:) containtAll()方法不帮你?

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

+0

是的,它的工作:)我不想执行数据库的操作复杂性,因为它更好的性能:) – JMA