Hibernate从HQL生成无效的SQL查询
这是我需要Hibernate构建的SQL查询(在我的SQL客户机工具中执行,运行速度非常快):Hibernate从HQL生成无效的SQL查询,sql,oracle,hibernate,hql,Sql,Oracle,Hibernate,Hql,这是我需要Hibernate构建的SQL查询(在我的SQL客户机工具中执行,运行速度非常快): 从决策中选择decision.decisionid 内部联接继续进行决策。proceedingId=PROCENDING.proceedingId 内部联接IPRIGHT\u继续IPRIGHT on proceedingId=IPRIGHT.proceedingId 其中继续进行。档案编码=7,决定。创建日期>=截止日期('2017-04-22','YYYY-MM-DD'),决定。创建日期=截止日期(
从决策中选择decision.decisionid
内部联接继续进行决策。proceedingId=PROCENDING.proceedingId
内部联接IPRIGHT\u继续IPRIGHT on proceedingId=IPRIGHT.proceedingId
其中继续进行。档案编码=7,决定。创建日期>=截止日期('2017-04-22','YYYY-MM-DD'),决定。创建日期=截止日期('2017-04-22','YYYY-MM-DD'),决定。更新日期=?和决策0_uu.creationdate=?首先,我认为您编写了JPQL代码,而不是HQL,但无论如何,您的查询都有很多问题。首先,查看您的选择:
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)
从决策d、程序p和程序i中选择d.decisionId
其中d.d=p和
p、 proceedingId=i和
d、 继续。档案索引=?1和
d、 creationDate>=?2和
d、 creationDate=?2和d.updatedate实际上是同一个表的3倍,这正是您告诉它对HQL所做的
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<=?
select decision.decisionId
FROM Decision decision, Proceeding proceeding, IprightProceeding iprightproceeding
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)