我想找到所有安装了“ b” = 500,“ b” = 501和“ c” = 2的“ a”。 我的三张桌子
在SQL我会这样做:
select a from table1 where id in (select info_id from table2 where b = '500')
intersect
select a from table1 where id in (select info_id from table2 where b = '501')
intersect
select a from table1 where id in (select info_id from table2 where id in (select ecu_id from table3 where c = '2'));
因此,我将创建三个SQL查询,然后采用这三个查询的交集。但是现在,我必须使用JPA criteria基于查询的查询,而不能使用本机SQL或JPQL。
我们可以JPA criteria基于三个不同的查询:
一个返回“ a”列表的列表,其中“ b” = 500,
一个返回“ a”列表的列表,其中“ b” = 501,并且
一个返回“ a”列表的位置,其中“ c” = 2。
然后筛选出现在所有三个返回列表中的所有“ a”。但这将花费很长时间,我们的数据库包含数百万个“ a”条目。
问题来源:Stack Overflow
因此,这是SQL中的一种解决方案:http : //tpcg.io/mV3rZ2Of
这与JPA标准查询一样长,因此,我仅说明如何翻译最后一个Exists条件,这是最难的部分:
Subquery<Table3> subQuery = searchQuery.subquery(Table3.class);
Root<Table3> fromTable3SubQuery = subQuery.from(Table3.class);
List<Predicate> subRestrictions = new ArrayList<>();
Subquery<Table2> subQueryForInExpression = searchQuery.subquery(Table2.class);
Root<Table2> fromTable2SubQuery = subQueryForInExpression.from(Table2.class);
subQueryForInExpression.select(fromTable2SubQuery.get(ID)).where(criteriaBuilder.equal(fromTable2SubQuery.get(info_id), root.get(ID)));
subRestrictions.add(criteriaBuilder.equal(fromTable3SubQuery.get(c), '2'));
subRestrictions.add(criteriaBuilder.in(fromTable3SubQuery.get(ecu_id)).value(subQueryForInExpression));
restrictions.add(criteriaBuilder.exists(subQuery.select(
fromTable3SubQuery.get(c)).where(
subRestrictions.toArray(new Predicate[0]))));
->这仅表示最后Exists一部分,要求提供c ='2'连接。其他类似,但没有subQueryForInExpression组成部分...
回答来源:Stack Overflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。