2012-01-18 14 views
10

Mam złożoną hierarchię klas z wieloma poziomami dziedziczenia i muszę zapytać o określone typy w tej hierarchii, używając HQL.Zapytanie HQL dla wielu typów/klas

Załóżmy, że mam zajęcia z kotów, psów i małp, z popularnym zwierzęciem klasy podstawowej.

Jak napisać zapytanie, które wybiera tylko niektóre z nich, powiedzmy, Kot i pies?

Muszę również sortować lub filtrować według niektórych właściwości zwierząt - powiedzmy, zwierzęta z seksem = "mężczyzna" i porządek według nazwy.

Czy to możliwe?

Odpowiedz

11

Standardową funkcją JPQL jest TYPE(), która również obsługuje Hibernate, jak wspomniano w jej documentation.

Proszę śledzić przykład:

select a from Animal a 
where type(a) in ('Cat', 'Dog') 
    and a.sex = 'Male' 
order by a.name 

hibernacji również wykorzystuje .class ukryte własności:

select a from Animal a 
where a.class in ('Cat', 'Dog') 
    and a.sex = 'Male' 
order by a.name 
+0

według knol] [NH (http://knol.google.com/k/nhibernate-chapter-12-hql-the-hibernate-query-language) autorstwa Fabio Maulo, "specjalna klasa właściwości uzyskuje dostęp do wartości dyskryminatora instancji w przypadku polimorficznej trwałości .Jedna nazwa klasy Java osadzona w klauzuli where zostać przetłumaczone na wartość dyskryminującą. " - więc wygląda na to, że jest to obsługiwane. Wypróbuję to jutro rano i opublikuję wynik tutaj, dzięki! –

+0

Magiczna właściwość .class działa świetnie z HQL w NH! Jako ostrzeżenie, API Kryteriów nie jest tak pomocne - wymagało strasznego obejścia, ręcznego pobrania dyskryminatora z mapowania, ponieważ API Kryteriów nie tłumaczy nazw klas do wartości dyskryminujących, ale oczekuje, że znasz dyskryminator wartość z góry. Okropne rzeczy. Ale z HQL działa świetnie! –