2017-09-03 87 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