条款中的Criteria API(过滤)

问题描述 投票:0回答:1

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

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

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

  • 亚历克斯:A,B,C
  • 约翰:A,B
  • 史蒂夫:B,C

要求:

  • 工人?能力= A,B,C - 应该只返回Alex 目前返回亚历克斯三次,约翰和史蒂夫两次
  • 工人?能力= A,C - 应该只返回Alex 目前两次回报亚历克斯,约翰和史蒂夫一次
  • 工人?能力= B,C - 应该归还亚历克斯和史蒂夫 目前返回亚历克斯两次,史蒂夫两次和约翰一次
  • 工人?能力= 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);
        };
    }
java spring-boot criteria-api
1个回答
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)

UPDATE

IN是一个OR条件。如果你想要name只有所有能力,你应该做以下(假设能力不会有一个人的多个条目)

select name from competences where competence in ('A', 'B', 'C') group by name having count(name) = 3;

3IN阵列的长度

© www.soinside.com 2019 - 2024. All rights reserved.