HQL:结合左右加入

时间:2015-07-13 07:20:14

标签: java sql hibernate orm hql

大家好日子,

我目前正在努力将以下SQL转换为HQL:

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
;

DB的结构方式是:

  • 一个人可能有一个或多个身份
  • 一个人有一个主要身份。主要标识是IS_MAIN_IDENTITY设置为1(true)
  • 的标识
  • 一个人可能有零个或多个条目

此查询的目的是构建一个屏幕集合,该集合应显示所有条目,其所有者(人)及其主要身份(因为只有身份包含人员姓名等)。

到目前为止,我在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}

我在这里做错了什么?或者是否有更好的方法来编写此查询?

感谢您提前抽出时间。

1 个答案:

答案 0 :(得分: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,但每个人还包含IdentityEntry个实体列表。然后,您可以访问UI上每个人的所有条目。