子句中的 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);

        };

    }


临摹微笑
浏览 76回答 1
1回答

慕后森

由于 Alex 有 3 个结果。我认为您的表结构如下所示name | competence-----------------Alex | AAlex | BAlex | CJohn | AJohn | B您当前在 sql 中的查询可能看起来像select name from competences where competence in ('A', 'B', 'C')您可能想要添加distinctselect distinct name from competences where competence in ('A', 'B', 'C')在criteriaAPI 中似乎.distinct(true)更新IN是一个OR条件。如果您只想name拥有所有能力,您应该执行以下操作(假设能力不会有一个人的多个条目)select name from competences where competence in ('A', 'B', 'C') group by name having count(name) = 3;3是IN数组的长度
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java