java - 选择具有所有 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 存储库为您提供的所有这些好处)。而且我不知道该怎么做:-)
所以我想知道是否有一个简单的解决方案。
解决方案
最后,正如@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);
推荐阅读
- python - 高斯过程回归 - 解释行为
- python - Python傅里叶零填充
- azure - Azure VM 规模集 CustomScriptExtension 失败
- docker - 每次我想更改应用程序设置时,我是否必须重建我的 Docker 映像?
- javascript - Vue2传单标记未显示
- git - 只有当特定分支在 CircleCI 中失败时,我才能获得通知?
- html - 如何使用 CSS 基于另一个开关切换一个开关?
- angular - 如何使用 jasmine 测试 Observable 订阅回调?
- c++ - 为什么我无法从 .c 文件访问 .ino 函数?
- python - Django - 在 DB 或字符串路径上创建 ImageField 更好吗?