首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hibernate从HQL生成无效的SQL查询

Hibernate从HQL生成无效的SQL查询
EN

Stack Overflow用户
提问于 2017-05-03 19:00:36
回答 1查看 87关注 0票数 0

这是我需要Hibernate构建的SQL查询(在我的sql客户端工具中执行,运行速度非常快):

代码语言:javascript
复制
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代码:

代码语言:javascript
复制
@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)"

这就是正在生成的可怕的查询,它花费了如此多的时间,甚至完全阻塞了服务器。

代码语言:javascript
复制
    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<=?

如你所见,它的事件加入了两个相同的表!

你能帮我个忙吗?

谢谢

EN

回答 1

Stack Overflow用户

发布于 2017-05-03 19:21:53

首先,我认为您编写的是JPQL代码,而不是HQL,但无论如何,您的查询都存在许多问题。首先,看看你的SELECT

代码语言:javascript
复制
select decision.decisionId
FROM Decision decision, Proceeding proceeding, IprightProceeding iprightproceeding

您正在这三个表之间进行交叉联接,因为实际上没有指定联接条件。您需要在JPQL的WHERE子句中限制联接。如果不这样做,它就是一个交叉连接。

最重要的是,您将对相同的表执行一系列内部联接,从而导致对某些表进行第二次联接。尝试下面的JPQL查询,它可能不是很完美,但应该更接近您打算运行的内容。

代码语言:javascript
复制
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有许多不同之处。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43758154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档