2016-07-20 116 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