如何使用Querydsl构造涉及多个表的复杂谓词?
How to use Querydsl to construct complex predicate that involves multiple tables?
我正在尝试利用 Querydsl 从 table 中获取一些结果。到目前为止,这是我尝试过的 -
假设有 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 查询保持 运行ning,而且似乎没有结束。
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
中,以便只获取第一个结果?
复杂性不在于谓词或 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();
我正在尝试利用 Querydsl 从 table 中获取一些结果。到目前为止,这是我尝试过的 -
假设有 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 查询保持 运行ning,而且似乎没有结束。
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
中,以便只获取第一个结果?
复杂性不在于谓词或 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();