为什么这个hql语句就像一个内连接?

时间:2016-02-10 14:25:04

标签: java oracle hibernate hql

为什么这个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,但我想要所有这些。

3 个答案:

答案 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 joinleft join

答案 1 :(得分:2)

因为您在用户中引用了tx.name。如果您使用Java访问它但在HQL中获取此列的值Hibernate进行隐式连接时,它应该不起作用。要获取所有值,您应该明确地执行它并包括外连接选项。

答案 2 :(得分:-2)

我相信你错过了where中的null部分,就像右连接一样

where user.clientId = :clientId or user.clientId IS NULL