Вот мои две сущности:
@Entity
@Table(name = "aog_reference")
public class AogReference
{
@OneToOne(fetch = FetchType.LAZY, mappedBy="aogReference", cascade=CascadeType.ALL, optional=true)
private Pack pack;
}
@Entity
@Table(name = "pack")
public class Pack
{
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name="aog_reference")
private AogReference aogReference;
}
Я могу читать и записывать обе эти сущности, используя Hibernate, и свойство AogReference pack заполнено правильно.
Однако я пытаюсь выполнить запрос HQL, который включает сущности AogReference, у которых нет пакета, ссылающегося на них.
Прочитав множество вещей по этому поводу, я ожидал бы, что это сработает:
SELECT e FROM AogReference AS e left join e.pack WHERE (e.pack IS NULL)
Но я вернул 0 строк, хотя я знаю, что есть сущности AogReference, которые не имеют каких-либоссылки от сущностей Pack.
Я посмотрел на SQL, сгенерированный вышеупомянутым hql, и он выглядит так:
select
aogreferen0_.id as id1_0_,
aogreferen0_.active as active2_0_,
aogreferen0_.created as created3_0_,
aogreferen0_.modified as modified4_0_,
aogreferen0_.version as version5_0_,
aogreferen0_.aog_delivery_number as aog_deli6_0_,
aogreferen0_.aog_destination as aog_dest7_0_,
aogreferen0_.aog_notes as aog_note8_0_,
aogreferen0_.foc_notification_time as foc_noti9_0_,
aogreferen0_.is_collection_today as is_coll10_0_,
aogreferen0_.is_used as is_used11_0_,
aogreferen0_.work_stream as work_st12_0_
from
aog_reference aogreferen0_
left outer join
pack pack1_
on aogreferen0_.id=pack1_.aog_reference
where
aogreferen0_.id is null
или упрощенно:
select *
from
aog_reference a
left outer join
pack p on a.id = p.aog_reference
where a.id is null
Сейчасобратите внимание на ошибку монстра:
where a.id is null
В Hibernate это совершенно неправильно.Сгенерированный sql должен быть таким:
select
aogreferen0_.id as id1_0_,
aogreferen0_.active as active2_0_,
aogreferen0_.created as created3_0_,
aogreferen0_.modified as modified4_0_,
aogreferen0_.version as version5_0_,
aogreferen0_.aog_delivery_number as aog_deli6_0_,
aogreferen0_.aog_destination as aog_dest7_0_,
aogreferen0_.aog_notes as aog_note8_0_,
aogreferen0_.foc_notification_time as foc_noti9_0_,
aogreferen0_.is_collection_today as is_coll10_0_,
aogreferen0_.is_used as is_used11_0_,
aogreferen0_.work_stream as work_st12_0_
from
aog_reference aogreferen0_
left outer join
pack pack1_
on aogreferen0_.id=pack1_.aog_reference
where
pack1_.id is null
Обратите внимание, что последняя строка теперь:
where pack1_.id is null
SQL, сгенерированный Hibernate, проверяет идентификатор на AogReference, когда он должен проверяться наидентификатор пакета.
Исправленный sql работает, когда я запускаю его в своей базе данных.
Это выглядит для меня как серьезная ошибка в Hibernate.Он просто не сформировал правильный sql.
Любые комментарии (разумные) с благодарностью получены.
Спасибо,
Ред.
ОБНОВЛЕНИЕ: Кажется, это ошибка в спящем режиме и существует с 2010 года.