2016-02-10 2 views
2

Почему этот оператор 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 

TX класс, который ссылается на класс пользователя может быть null. Почему я получаю результат, как будто я сделал inner join? Я просто получаю User с TX, но я хочу, чтобы все они были.

+0

Мы ожидаем большего объяснения и ошибки вывода: – Musaddique

+0

Ошибка отсутствует. Пользователь может иметь TX, но если у пользователя его нет, он не появляется в списке результатов. Я хотел бы, чтобы все пользователи появлялись с тех пор, как я не делаю прямое внутреннее соединение в таблице TX. – user489872

ответ

2

Потому что вы указали tx.name у пользователя. Он не должен работать, если вы обращаетесь к нему на Java, но в HQL, чтобы получить значение для этого столбца. Hibernate делает неявное соединение. Чтобы получить все значения, вы должны сделать это явно и включить внешнее соединение.

-2

Я считаю, что вам не хватает нулевую часть в где, который будет как право присоединиться

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

Клиент всегда установлен – user489872

+0

В этом ответе отсутствует точка. Проблема заключается не в 'clientId', а в' tx' ссылке, используемой в неявном соединении – Vogel612

3

The HQL reference переговоры об этом в разделе 14.4:

HQL поддерживает две формы Объединение: неявное и явно.

Запросы, показанные в предыдущем разделе, используют явную форму, , где ключевое слово join явно используется в предложении from. Это рекомендуемая форма.

В неявной форме не используется ключевое слово 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 для краткости.

Смежные вопросы