2012-01-18 27 views
10

Ho una gerarchia di classi complesse con più livelli di ereditarietà e ho bisogno di eseguire query per determinati tipi specifici all'interno di tale gerarchia, utilizzando HQL.Query HQL per più tipi/classi

Diciamo che ho classi Cat, Dog e Monkey, con un animale di classe base comune.

Come si scrive una query che seleziona solo alcune di quelle, diciamo, Cat and Dog?

Devo anche ordinare o filtrare in base a determinate proprietà degli animali - quindi diciamo, gli animali con Sesso = "Maschio" e l'ordine per nome.

È possibile?

risposta

11

La funzione standard JPQL è TYPE(), supportata anche in Hibernate, come indicato nel suo documentation.

favore, seguire un esempio:

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

Hibernate usa anche il .class struttura implicito:

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

secondo la [NH knol] (http://knol.google.com/k/nibernate-chapter-12-hql-the-hibernate-query-language) di Fabio Maulo, "la classe di proprietà speciale accede al valore discriminatore di un'istanza nel caso di persistenza polimorfica. Un nome di classe Java incorporato nella clausola where essere tradotto al suo valore discriminatore. " - Quindi sembra che sia supportato. Ci proverò domani mattina e posterò il risultato qui, grazie! –

+0

La proprietà .class magica funziona alla grande con HQL in NH! Come avvertimento, l'API Criteri non è altrettanto utile: ha richiesto un orribile work-around, recuperando manualmente il discriminatore dal mapping, poiché l'API Criteria non traduce i nomi delle classi in valori discriminatori, ma si aspetta che tu conosca il discriminatore valore in anticipo. Roba terribile Ma con HQL funziona alla grande! –

Problemi correlati