为什么这个HQL语句就像一个内连接?
select
user.id,
user.allocationVersion,
user.tx.statusId,
user.userId,
user.nameFirst,
user.nameLast,
user.email1,
user.statusId,
user.tx.name,
user.note1,
user.note2
from
module.bb.jpa.User as user
where user.clientId = :clientId
order by user.id DESC
User类中引用的TX
类可以是null
。为什么我得到的结果好像我做了inner join
?我只是User
获得TX
,但我想要所有这些。
答案 0 :(得分:3)
HQL reference在第14.4节中讨论了这个问题:
HQL支持两种形式的关联加入:隐式和显式。
上一节中显示的查询都使用显式表单, 也就是说,在from子句中显式使用join关键字。 这是推荐的表格。
隐式表单不使用join关键字。相反, 使用点符号对“关联”进行“解除引用”。隐式连接可以 出现在任何HQL子句中。内联接中的隐式连接结果 在生成的SQL语句中。
from Cat as cat where cat.mate.name like '%s%'
[由我突出显示]。
你的HQL基本上等同于:
select
user.id,
user.allocationVersion,
user.tx.statusId,
user.userId,
user.nameFirst,
user.nameLast,
user.email1,
user.statusId,
user.tx.name,
user.note1,
user.note2
from
module.bb.jpa.User as user
join module.bb.jpa.Tx as tx -- This is an abbreviated inner join
where user.clientId = :clientId
order by user.id DESC
要“纠正”此行为,您必须明确指定left outer join
或left join
。
答案 1 :(得分:2)
因为您在用户中引用了tx.name
。如果您使用Java访问它但在HQL中获取此列的值Hibernate进行隐式连接时,它应该不起作用。要获取所有值,您应该明确地执行它并包括外连接选项。
答案 2 :(得分:-2)
我相信你错过了where中的null部分,就像右连接一样
where user.clientId = :clientId or user.clientId IS NULL