簡體   English   中英

如何使用Querydsl構造涉及多個表的復雜謂詞?

[英]How to use Querydsl to construct complex predicate that involves multiple tables?

我正在嘗試利用 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();

如何在上述JPAQuery中合並limit ,以便只獲取第一個結果?

復雜性不在於謂詞或 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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM