首页 > 解决方案 > 选择具有所有 IN 列表引用的行

问题描述

我有这些模型和存储库:

(跳过所有不相关的字段和 getter/setter)

public class Contact {

    @Id
    private Integer id;

    private String name;

    @ManyToMany
    private List<TargetGroup> targetGroups = new ArrayList<>();

}
public class TargetGroup {

    @Id
    private Integer id;

    @NotBlank
    private String name;

}
@Repository
public interface ContactRepository extends CrudRepository<Contact, Integer> {

    @Query("SELECT c FROM Contact c JOIN c.targetGroups tg " +
            "WHERE (tg.id IN :targetGroups)")
    Page<ContactView> customFilterWithTargetGroups(@Param("targetGroups") Set<Integer> targetGroups, Pageable pageable);

}

简而言之,customFilterWithTargetGroups方法返回具有提供的目标组 id 之一的联系人。这工作正常。

现在我需要选择具有所有提供的目标组 ID 的联系人。JPA可以吗?

我能想到的只是将查询手动构造为字符串,然后使用实体管理器执行它,但这会带来无数其他问题(分页、排序、投影以及 JPA 存储库为您提供的所有这些好处)。而且我不知道该怎么做:-)

所以我想知道是否有一个简单的解决方案。

标签: javajpaspring-data-jpa

解决方案


最后,正如@Thomas所指出的那样,这里已经解决了我的问题 -使用 jpql 查找包含给定集合的所有元素的集合的项目

我决定在这里分享我的问题的确切解决方案代码,也许它会对某人有所帮助:

@Query("SELECT c FROM Contact c JOIN c.targetGroups tg " +
            "WHERE (tg.id IN :targetGroups)" +
            " GROUP BY c.id HAVING count(c.id) = :groupsCount")
    Page<ContactView> customFilterWithTargetGroups (@Param("targetGroups") Set<Integer> targetGroups, @Param("groupsCount") long groupsCount, Pageable pageable);

推荐阅读