2015-07-13 66 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

您只需遍历所有人员并将所有条目推送到新集合 –