HQL:结合左连接和右连接
HQL: Combine Left and Right Join
大家好,
我目前正在努力将以下 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
;
数据库的结构方式是:
- 一个人可能有一个或多个身份
- 一个人有一个主要身份。主要身份是 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}
我在这里做错了什么?还是有更好的方法来编写此查询?
提前感谢您抽出时间。
您需要像这样编写 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
所以你 select 只有 Persons
但每个人还包含 Identity
和 Entry
实体列表。然后,您可以访问 UI.
上每个人的所有条目
大家好,
我目前正在努力将以下 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
;
数据库的结构方式是:
- 一个人可能有一个或多个身份
- 一个人有一个主要身份。主要身份是 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}
我在这里做错了什么?还是有更好的方法来编写此查询?
提前感谢您抽出时间。
您需要像这样编写 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
所以你 select 只有 Persons
但每个人还包含 Identity
和 Entry
实体列表。然后,您可以访问 UI.