HQL для проверки на NULL в отношении OneToOne - PullRequest
0 голосов
/ 16 октября 2018

Вот мои две сущности:

@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 года.

...