子句中的条件 API(过滤)

Criteria API in clause (filtering)

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

我需要找到具有特定权限(如许可证等)的用户。

假设我的用户具有能力:

请求:

目前它找到所有具有能力 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;

3IN数组的长度