子句中的条件 API(过滤)
Criteria API in clause (filtering)
嘿,我的查询有一个小问题。
我需要找到具有特定权限(如许可证等)的用户。
假设我的用户具有能力:
- 亚历克斯:A、B、C
- 约翰:A,B
- 史蒂夫:B,C
请求:
- workers?competences=A,B,C - 应该只有 return 亚历克斯
- 目前 returnAlex 三次,John 和 Steve 两次
- workers?competences=A,C - 应该只有 return 亚历克斯
- 目前 returnAlex 两次,John 和 Steve 一次
- workers?competences=B,C - 应该 return Alex 和 Steve
- 目前 returnAlex 两次,Steve 两次,John 一次
- workers?competences=B - 应该 return 所有用户
- 目前return每个人一次
目前它找到所有具有能力 A 或 B 或 C 的用户。
我需要 return 具有所有插入权限的用户所以 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 个结果。我认为您的 table 结构如下
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
数组的长度
嘿,我的查询有一个小问题。
我需要找到具有特定权限(如许可证等)的用户。
假设我的用户具有能力:
- 亚历克斯:A、B、C
- 约翰:A,B
- 史蒂夫:B,C
请求:
- workers?competences=A,B,C - 应该只有 return 亚历克斯
- 目前 returnAlex 三次,John 和 Steve 两次
- workers?competences=A,C - 应该只有 return 亚历克斯
- 目前 returnAlex 两次,John 和 Steve 一次
- workers?competences=B,C - 应该 return Alex 和 Steve
- 目前 returnAlex 两次,Steve 两次,John 一次
- workers?competences=B - 应该 return 所有用户
- 目前return每个人一次
目前它找到所有具有能力 A 或 B 或 C 的用户。
我需要 return 具有所有插入权限的用户所以 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 个结果。我认为您的 table 结构如下
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
数组的长度