2016-07-20 115 views
1

我试图做一个查询hql hibernate(版本3.5.3),查询包括几个不同的表(4表)之间的联接。这是查询:加入休眠HQL

 SELECT (lot of stuff) 
    FROM InvestigationRule as ir 
    JOIN InvestigationFormula as if ON (ir.tb33InvestigationFormula=if.idInvestigationFormula) 
    JOIN InvestigationEvent as ie ON (ir.tb27InvestigationEvent=ie.idInvestigationEvent) 
    JOIN InvestigationSectionEvent as ise ON (ie.eventSection=ise.sectionEventsCod) 

我在第一次遇见一个语法错误,有人可以帮我解决这个问题,THX。

PS:我知道,我可以加入即使不使用JOIN命令,这是原始查询:

SELECT (lot of stuff) 
    FROM InvestigationRule AS ir, 
     InvestigationEvent as ie, 
     InvestigationSectionEvent as ise, 
     InvestigationFormula as if 
      WHERE ir.dateValidityEnd is null 
      AND ir.tb27InvestigationEvent = ie.idInvestigationEvent 
      AND ir.tb33InvestigationFormula = if.idInvestigationFormula 
      AND ie.eventSection = ise.sectionEventsCod 

但由于它在创建几个CROSS JOIN(S)我不能使用这种形式MySql数据库,这是不好的。

+2

SELECT (lot of stuff) FROM InvestigationRule as ir JOIN InvestigationFormula as iform ON (ir.tb33InvestigationFormula=iform.idInvestigationFormula) JOIN InvestigationEvent as ie ON (ir.tb27InvestigationEvent=ie.idInvestigationEvent) JOIN InvestigationSectionEvent as ise ON (ie.eventSection=ise.sectionEventsCod) 

HQL模样。而且你所拥有的不是HQL。这是SQL – Jens

+0

简言之,适当地建模你的实体,你不应该这样加入。无论如何,最新版本的Hibernate确实提供了这种任意加入,但除非必要,否则我不会推荐使用它。这只是破坏了使用ORM的整个想法,你应该组成一个适当的实体模型 –

+0

向我们展示映射这些表的Hibernate实体。 – Dherik

回答

2

if是SQL关键字,所以你必须改变别名:如果是在SQL关键字

SELECT (lot of stuff) 
    FROM InvestigationRule ir 
    JOIN ir tb33InvestigationFormula iform 
    JOIN ir.tb27InvestigationEvent ie 
    JOIN ie.eventSection ise 
+0

我改变了别名,但我遇到了ON上的相同问题。 ps:这是hql不是sql°W – Removed

+2

@删除不要以为是同一个错误。在HQL中你不必写。你必须使用不属于列名的属性 – Jens

+0

我试图在不使用JOIN的情况下进行查询(我在这里写的第二个查询),但它使数据库上的CROSS JOIN(s),我应该避免这种情况。 – Removed