为了账号安全,请及时绑定邮箱和手机立即绑定

子句中的 Criteria API(过滤)

子句中的 Criteria API(过滤)

临摹微笑 2022-07-27 21:24:32
嘿,我的查询有一个小问题。我需要找到具有特定能力的用户(如许可证和东西)。可以说我有能力的用户:亚历克斯: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);        };    }
查看完整描述

1 回答

?
慕后森

TA贡献1802条经验 获得超5个赞

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

在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数组的长度


查看完整回答
反对 回复 2022-07-27
  • 1 回答
  • 0 关注
  • 75 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信