我有一个名为product的类,它有很多标签。
此类对象定义如下:
public class Product{
@ManyToMany
@LazyCollection(LazyCollectionOption.FALSE)
private List<Tag> tags;
}
由于产品可能包含大量标签。如果我想同时选择带有标签A和B的产品。我可以用JPA方式实现吗?
我可以使用原生查询SELECT t.product_id FROM ta_product p INNER JOIN ta_product_tags t ON p.id = t.product_id GROUP BY t.product_id HAVING SUM(CASE WHEN t.tags_id IN (?1) THEN 1 ELSE 0 END) >= ?2 LIMIT ?3,?4
轻松完成,但它不支持Pageable
界面。
我尝试编写像这样的查询
@Query("SELECT COUNT(p.id) FROM Product p INNER JOIN p.tags t WHERE SUM(CASE WHEN t.id IN ?1 THEN 1 ELSE 0 END) >= ?2 ")
int countByTags(List<Long> tagIds, long length);
它告诉我Invalid use of group function
我可以使用Pageable
接口的任何解决方案吗?
答案 0 :(得分:0)
我终于找到了解决方案
@Query("SELECT COUNT (p1.id) FROM Product p1 WHERE p1.deleted = false AND EXISTS (SELECT p FROM Product p INNER JOIN p.tags t WHERE p1.id = p.id GROUP BY p.id HAVING SUM(CASE WHEN t.id IN ?1 THEN 1 ELSE 0 END) >= ?2)")
int countByTags(List<Long> tagIds, long length);