当前位置: 首页 > 知识库问答 >
问题:

如何使用Querydsl构造涉及多个表的复杂谓词?

岳昊空
2023-03-14

我试图利用Querydsl从表中获取一些结果。到目前为止,这是我尝试过的--

SELECT T1.*
FROM T1,T2,T3,T4,T5
WHERE T1.A=T2.A
AND T2.B=T5.B
AND T4.C=T2.C
AND T1.B=1234;
booleanBuilder.and(JPAExpressions.select(qT1).from(qT1,qT2,qT3,qT4,qT5)
.where(
    qT1.a.eq(qT2.a)
    .and(qT1.a.eq(qT2.a))
    ... // and so on
    .exists());
JPQLQuery jpqlQuery = new JPAQuery(entityManager);
        jpqlQuery.select(qT1).from(qT1, qT2, qT3, qT4, qT5).where(booleanBuilder);
        return jpqlQuery.fetch();

如何在上面的JPAQuery中合并limit以便只获取第一个结果?

共有1个答案

蔡鹏程
2023-03-14

复杂性不在谓词或QueryDSL中,而是在必须为结果中的每一行执行的子查询中执行它。根据结果集的总大小,这可能会变得越来越难以计算。然而,在QueryDSL、Hibernates HQL、JPA的JPQL或数据库SQL中,它同样复杂。所以您试图生成的SQL也同样慢。

您可能会成功地使用limit子句优化查询。在QueryDSL中为查询添加一个limit子句是相当简单的:.limit(1)。因此您的查询变为:

JPQLQuery jpqlQuery = new JPAQuery(entityManager);
        jpqlQuery.select(qT1).from(qT1, qT2, qT3, qT4, qT5).where(booleanBuilder);
        jpqlQuery.limit(1);
        return jpqlQuery.fetch();
 类似资料: