我想传递一个列表,其中所有内容都应该匹配。
@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
那么结果应该是所有拥有设备 1 and 2 and 3
的 gym
设施也一样
我试过了 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
最佳答案
假设列表不包含重复项,此查询应为您提供匹配所有 listOfEquipment
的 Gym.id
。
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}
))
关于java - spring data jpa 和多个集合的条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47365473/