2017-05-03 53 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不同。