Hibernate HQL оставил соединение с нулевыми значениями
У меня есть эти 2 таблицы
таблица А со столбцами: идентификатор, описание, заголовок
таблица B со столбцами: id, user, authenticnt, rel_id
таблица B rel_id - это FK для таблицы A.id (один к одному)
==> Table A Entity
==> @JoinColumn(name = "REL_ID", nullable = false, referencedColumnName = "ID")
private ObjectTableA objA;
Теперь я хочу получить с HQL такой же результат, как Sql:
select *
from tableA a
left outer join tableB b on a.id = b.REL_ID and b.user='ADMIN';
которые включают в себя все таблицы A строки ONCE и ссылки на таблицу B (включая ноль)
например.
id - description - title - id - user - authent - rel_id
1 - des1 - tit1 - 6 - admin - 4 - 5
2 - des2 - tit2 - null - null - null - null
Проблема с Hibernate HQL и второй строкой выше (id=2) заключается в том, что я не могу добраться до данных таблицы A, выполнив EntityB.rel_id, поскольку объект rel_id (типом EntityA) является нулевым, что указывает на то, что я не могу показать требуемый данные на мой взгляд! Как я могу преодолеть эту проблему? Спасибо!
1 ответ
Либо я не правильно понял проблему, либо вы должны объяснить ее по-другому.
Один факт, который кажется запутанным, является отображением, которое вы показываете. Это говорит
Таблица А Сущность
но есть поле типа ObjectTableA
, Возможно ли, что это исходный код ObjectTableB
, В противном случае для меня это выглядит как ссылка на себя (Entity ObjectTableA содержит поле типа ObjectTableA) и не имеет смысла в этом случае.
Если мое предположение верно и, следовательно, ваше отображение говорит nullable=false
, никогда не должно быть сущности B без соответствующей сущности A. В противном случае возможно, что существует множество сущностей типа A без связанной сущности типа B. Это именно то, о чем ваша вторая строка:
2 - des2 - tit2 - ноль - ноль - ноль - ноль
Если вы хотите получить все объекты ObjectTableA, ваш запрос HQL будет выглядеть примерно так:
Запрос № 1: SELECT a FROM ObjectTableA a;
Если вы хотите получить все объекты ObjectTableB, это будет выглядеть так:
Запрос № 2: SELECT b FROM ObjectTableB b WHERE b.user =:username;
Если вы также хотите загрузить все объекты ObjectTableA вместе с объектами ObjectTableB, напишите что-то вроде:
Запрос № 3: SELECT b FROM ObjectTableB b JOIN FETCH b.objA AS a WHERE b.user =:username;
Конечно, вы получите доступ только к данным вашей строки (объект A без правильного объекта B) с HQL-запросом № 1, но это должно быть понятно.