【问题标题】:How to use Querydsl to construct complex predicate that involves multiple tables?如何使用Querydsl构造涉及多个表的复杂谓词?
【发布时间】:2020-11-25 01:18:11
【问题描述】:

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

假设有 5 个名为 T1..T5 的实体。我正在尝试在 Querydsl 中执行此 SQL 查询 -

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;

我尝试了以下方法,但 Hibernate 查询一直在运行,并且似乎没有结束。

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());

我正在使用扩展 QuerydslPredicateExecutor 的存储库并使用 findAll 执行此操作。问题是查询需要永远运行。我只对可能出现的第一个结果感兴趣。 那么,我哪里出错了,导致查询永远执行?

编辑: 我选择改用 JPAQuery。当然,生成的 Hibernate 查询也是一样的。这是我的 JPAQuery。

JPQLQuery jpqlQuery = new JPAQuery(entityManager);
        jpqlQuery.select(qT1).from(qT1, qT2, qT3, qT4, qT5).where(booleanBuilder);
        return jpqlQuery.fetch();

如何将limit 合并到上述JPAQuery 中,以便只获取第一个结果?

【问题讨论】:

    标签: java spring-data-jpa querydsl


    【解决方案1】:

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

    您可能会成功地使用限制子句优化查询。在 QueryDSL 中为查询添加限制子句非常简单:.limit(1)。那么你的查询就变成了:

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

    【讨论】:

    • 谢谢。看来尽快获得结果的唯一方法是优化我的查询。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-21
    相关资源
    最近更新 更多