2015-07-13 47 views
1

好日子大家,HQL:將左,右加入

我目前用下面的SQL轉換爲HQL struggeling:

SELECT 
    e.ID, 
    p.ID, 
    i.ID 
FROM 
    ENTRY e 
    JOIN PERSON p ON e.FK_PERSON = p.ID 
    RIGHT JOIN IDENTITY i ON i.FK_PERSON = p.ID 
WHERE 
    i.IS_MAIN_IDENTITY = 1 
; 

數據庫的結構方式是:

  • 一個人可能有一個或多個身份
  • 一個人有一個主要身份。主要的身份是IS_MAIN_IDENTITY身份設置爲1(真)
  • 一個人可以具有零個或多個條目

此查詢的目的是要建立一個屏幕集合應顯示所有條目,它們的主人(人),他們的主要身份(因爲只有身份包含一個人的名字,等等)

我嘗試迄今在HQL執行此查詢是:

select 
    entr, 
    pers, 
    iden 
from 
    MEntry entr 
    join entr.entrPerson pers 
    right join iden.idenPerson 

但是這給了我下面的異常:

java.lang.IllegalStateException: No data type for node: 
org.hibernate.hql.internal.ast.tree.IdentNode 
\-[IDENT] IdentNode: 'iden' {originalText=iden} 

我在做什麼錯在這裏?還是有更好的方法來編寫這個查詢?

非常感謝您提前預約。

回答

0

你需要寫您的SQL查詢是這樣的:

SELECT 
    e.ID, 
    p.ID, 
    i.ID 
FROM 
    PERSON p 
    INNER JOIN ENTRY e ON e.FK_PERSON = p.ID 
    INNER JOIN IDENTITY i ON i.FK_PERSON = p.ID 
WHERE 
    i.IS_MAIN_IDENTITY = 1 

和HQL等價是:

select 
    p 
from 
    Person p 
    join fetch p.entries e 
    join fetch p.identity 

所以你只能選擇Persons但每個人還含有作爲Identity和列表Entry實體。然後,您可以在您的用戶界面上訪問每個人的所有條目。

+0

這將是科西嘉的想法。但是,你將如何迭代**所有**條目?這聽起來像我不得不做額外的步驟來建立一個條目列表。或者我錯過了什麼? – rGunti

+0

您只需遍歷所有人員並將所有條目推送到新集合 –