2011-08-30 9 views
6

Mam następujący jeden-na-jeden relacja w Hibernate (które mogłyby być null):HQL z Null czeku na jeden-do-jednego stosunku

<one-to-one name="details" class="com.example.Details" lazy="false" cascade="all"/> 

Próbuję zaznaczyć wszystkie podmioty, które nie -null szczegóły z HQL:

from Entity e where e.details is not null 

ale to zwraca wszystkie elementy, bez względu na to, czy szczegóły są puste czy nie.

Jaki byłby prawidłowy HQL?

Odpowiedz

5

Ok znalazłem rozwiązanie:

select e from Entity e join e.details d where d is not null 
+0

W moim przypadku stwierdziłem, że po prostu potrzebuję tego: wybierz e z Entity e join e.details Ponieważ spowoduje wygenerowanie "wewnętrznego sprzężenia" w SQL i nie zwróci wyników, jeśli nie ma żadnych szczegółów. –

1

Załóżmy, że ta relacja jeden-do-jednego jest częścią mapowania tabeli herpderp, w związku z tym jednostka herpderp ma właściwość details.

Czy masz na myśli, że zapytanie zwraca te rekordy herpderp, w których pole herpderp.details ma wartość NULL?

A może masz na myśli coś takiego?

from Entity e where e.details.someDetailsField is not null 
+0

rozumiem 'zwraca te rekordy herpderp gdzie pole herpderp.details jest null'. Twój HQL działa, ale problem polega na tym, że wszystkie pola wewnątrz danych mogą mieć wartość zerową, więc nie mogę na nich polegać. Jeśli próbuję sprawdzić indeks podstawowy: "e.details.id nie jest pusty", to ponownie zwraca wszystko (co jest bardzo dziwne). – serg

1

Można też najprawdopodobniej użyć funkcji elements HQL.

W sekcji wyrażenia HQL 3.3 Documentation

from Cat cat where exists elements(cat.kittens) 

co powinno zapytaniu jako

Select Entity e where exists elements(e.details)