2017-05-03 57 views
0

無效的SQL查詢這是SQL查詢,我需要Hibernate的建立(在我的SQL客戶端工具執行運行非常快):Hibernate會從HQL

select decision.decisionid from Decision decision 
INNER JOIN Proceeding proceeding on decision.proceedingId=proceeding.proceedingId 
INNER JOIN IPRIGHT_PROCEEDING ipright on proceeding.proceedingId=ipright.proceedingId 
where proceeding.dossierkindcode=7 and decision.creationdate>=TO_DATE('2017-04-22','YYYY-MM-DD') and decision.creationdate<=TO_DATE('2017-04-27','YYYY-MM-DD') or decision.updatedate>=TO_DATE('2017-04-22','YYYY-MM-DD') and decision.updatedate<=TO_DATE('2017-04-27','YYYY-MM-DD') 

這是HQL代碼,我寫道:

@Query("select decision.decisionId FROM Decision decision, Proceeding proceeding, IprightProceeding iprightproceeding" 
     + " INNER JOIN decision.proceeding" 
     + " INNER JOIN iprightproceeding.proceeding" 
     + " WHERE decision.proceeding.dossierKind = ?1" 
     + " AND decision.creationDate>=?2" 
     + " AND decision.creationDate<=?3" 
     + " OR (decision.updatedate>=?2 AND decision.updatedate<=?3)" 

這是生成的糟糕的查詢,需要花費很多時間甚至完全阻塞服務器。

Hibernate: select decision0_.decisionid as col_0_0_ from DECISION decision0_ 
inner join PROCEEDING proceeding3_ on decision0_.proceedingid=proceeding3_.proceedingid 
cross join PROCEEDING proceeding1_ 
cross join IPRIGHT_PROCEEDING iprightpro2_ 
inner join PROCEEDING proceeding4_ on iprightpro2_.proceedingid=proceeding4_.proceedingid 
where proceeding3_.dossierkindcode=? and decision0_.creationdate>=? and decision0_.creationdate<=? or decision0_.updatedate>=? and decision0_.updatedate<=? 

正如你所看到的,它的活動連接兩次同一張表!

請問您能幫我嗎?

感謝

+0

實際上是同一張表的3倍,而這正是你告訴它用你的HQL所做的 – veljkost

回答

0

首先,我認爲你寫JPQL代碼,而不是HQL,但在任何情況下,你的查詢有許多問題。首先,看看你的SELECT

select decision.decisionId 
FROM Decision decision, Proceeding proceeding, IprightProceeding iprightproceeding 

你正在做的這三個表之間的交叉連接,因爲沒有有效的連接條件規定存在。您需要限制JPQL的WHERE子句中的聯接。沒有這樣做,這是一個交叉連接。

在此之上,然後對同一個表執行一系列內部連接,導致某些表的第二次連接。嘗試下面的JPQL查詢,這可能不完美,但應該更接近您打算運行的內容。

select d.decisionId FROM Decision d, Proceeding p, IprightProceeding i 
where d.proceeding = p and 
     p.proceedingId = i and 
     d.proceeding.dossierKind = ?1 and 
     d.creationDate >= ?2 and 
     d.creationDate <= ?3 or 
     (d.updatedate >= ?2 AND d.updatedate <= ?3) 

JPQL語法有各種各樣的味道,並且在許多方面與ANSI SQL不同。