2017-11-18 193 views
3

我想通過一個所有應該匹配的列表。彈簧數據jpa和多個集合的條件

@Query("select g.name as name FROM Gym g " + 
      "LEFT JOIN g.listOfEquipment listOfEquipment " + 
      "WHERE " + 
      "(((:listOfEquipment) is null) or listOfEquipment.id in (:listOfEquipment)) "+ 
      "AND (((:listOfAmenity) is null) or listOfAmenity.id in (:listOfAmenity))") 
    Page<Map<String, Object>> listing(@Param("listOfEquipment") Set<Integer> listOfEquipment,@Param("listOfAmenity") Set<Integer> listOfAmenity) 

上述查詢OR工作,但我需要AND

假如我是路過1,2,3 那麼結果應該是所有gym誰擁有設備1 and 2 and 3 同爲舒適性也

我試圖 Finding items with a set containing all elements of a given set with jpql

但它沒有幫助荷蘭國際集團我監守有多個過濾器

網址是

http://localhost:8080/filter?listOfEquipment=5,3&listOfAmenity=51,13&sort=name 
+3

「不工作」。我想知道這意味着什麼。也許通過查看調用的SQL,你會發現更多?此處沒有人看到實體類可能會丟失什麼 – DN1

回答

2

該查詢應該給你Gym.id與假設列表不包含重複項的所有listOfEquipment相匹配。

select g.id as name 
FROM Gym g 
LEFT JOIN g.listOfEquipment listOfEquipment 
WHERE listOfEquipment.id in (:listOfEquipment)) 
GROUP BY g.id 
HAVING count(g.id) = #{#listOfEquipment.size}  

你可以用它在你的主查詢爲listOfAmenity類似查詢的子查詢。

select g.name as name 
FROM Gym g 
LEFT JOIN g.listOfEquipment listOfEquipment 
WHERE (((:listOfEquipment) is null) 
    OR g.id in (
    select g.id as name 
    FROM Gym g 
    LEFT JOIN g.listOfEquipment listOfEquipment 
    WHERE listOfEquipment.id in (:listOfEquipment)) 
    GROUP BY g.id 
    HAVING count(g.id) = #{#listOfEquipment.size} 
)) 
AND (((:listOfAmenity) is null) 
    OR g.id in (
    select g.id as name 
    FROM Gym g 
    LEFT JOIN g.listOfAmenity listOfAmenity 
    WHERE listOfAmenity.id in (:listOfAmenity)) 
    GROUP BY g.id 
    HAVING count(g.id) = #{#listOfAmenity.size} 
)) 
1

沒有在最後的,條件 缺少的支架應該是如下

@Query("select g.name as name FROM Gym g " + 
     "LEFT JOIN g.listOfEquipment listOfEquipment " + 
     "WHERE " + 
     "(((:listOfEquipment) is null) or listOfEquipment.id in  (:listOfEquipment)) "+ 
     "AND (((:listOfAmenity) is null) or listOfAmenity.id in (:listOfAmenity))") 
+0

,因爲這不是我原來的查詢。 但它不能解決我的問題。 ,因爲我不想'或'條件我需要'和'條件 –