子句中的Criteria API(过滤)

时间:2019-03-11 14:38:15

标签: java spring-boot criteria-api

嘿,我的查询有一个小问题。

我需要找到具有特定能力(例如许可证和资料)的用户。

让我们说我的用户具有能力:

  • Alex:A,B,C
  • John:A,B
  • 史蒂夫:B,C

请求:

  • workers?competences = A,B,C-应该只返回Alex
    • 当前返回Alex三次,John和Steve两次
  • workers?competences = A,C-应该只返回Alex
    • 当前返回Alex两次,John和Steve一次
  • 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);
        };
    }

1 个答案:

答案 0 :(得分:1)

由于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;

3IN数组的长度