java - 子句中的 Criteria API(过滤)
问题描述
嘿,我的查询有一个小问题。
我需要找到具有特定能力的用户(如许可证和东西)。
可以说我有能力的用户:
- 亚历克斯:A、B、C
- 约翰:A,B
- 史蒂夫:B,C
要求:
- workers?competences=A,B,C - 应该只返回 Alex
- 目前返回 Alex 3 次,John 和 Steve 两次
- workers?competences=A,C - 应该只返回 Alex
- 目前返回亚历克斯两次,约翰和史蒂夫一次
- workers?competences=B,C - 应该返回 Alex 和 Steve
- 目前返回 Alex 两次,Steve 两次,John 一次
- workers?competences=B - 应该返回所有用户
- 目前返回每个人一次
目前,它会查找所有具有能力 A 或 B 或 C 的用户。
我需要它来返回具有所有插入权限的用户competence A AND competence B AND competence C
。
这是我目前的规范:
public static Specification<WorkDetail> hasCompetences(String searchTerm) {
return (root, query, criteriaBuilder) -> {
List<String> list = new ArrayList<>(Arrays.asList(searchTerm.split(",")));
Join join = root.join("competences");
return join.get("name").in(list);
};
}
解决方案
由于 Alex 有 3 个结果。我认为您的表结构如下所示
name | competence
-----------------
Alex | A
Alex | B
Alex | C
John | A
John | B
您当前在 sql 中的查询可能看起来像
select name from competences where competence in ('A', 'B', 'C')
您可能想要添加distinct
select distinct name from competences where competence in ('A', 'B', 'C')
在criteria
API 中似乎.distinct(true)
更新
IN
是一个OR
条件。如果您只想name
拥有所有能力,您应该执行以下操作(假设能力不会有一个人的多个条目)
select name from competences where competence in ('A', 'B', 'C') group by name having count(name) = 3;
3
是IN
数组的长度
推荐阅读
- php - 将图像分成两部分并显示图像 PHP
- html - 通过 Outlook 启动服务器
- firebase - 由于“替换 /workspace/.runtimeconfig.json?”而导致 Firebase 函数在 GCP 上的 CICD 失败 错误
- r - 在 R 中保存工作,更改工作目录,我不断收到消息“权限被拒绝”
- python-3.x - Python Selenium如何在列表中从变量中分离数据
- javascript - 如何按顺序运行 fetch 语句?
- python - 检查重复文件版本并仅在 Python 中保留具有指定模式的最新文件
- flutter - 如何在我的 ValueNotifier 中使用 Dart 类的字段作为值?
- eclipse - 选择不包含编译单元
- c# - C# 从 HTML Body 解析 XML 并保存到文件