开发者社区> 问答> 正文

基于JPA标准的查询,可一次相交三个查询

我想找到所有安装了“ 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

展开
收起
montos 2020-03-22 12:22:53 682 0
1 条回答
写回答
取消 提交回答
  • 因此,这是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

    2020-03-22 12:23:41
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
RowKey与索引设计:技巧与案例分析 立即下载
重新定义计算的边界 立即下载
低代码开发师(初级)实战教程 立即下载