繁体   English   中英

子句中的Criteria API(过滤)

[英]Criteria API in clause (filtering)

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

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

可以说我的用户具有能力:

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

要求:

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

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

INOR条件。 如果您只想使用所有能力来name ,则应执行以下操作(假设一个人不会有多个条目)

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

3IN数组的长度

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM