2011-02-03 10 views
11

Sto costruendo una query su una tabella generica "Sample" e ho diversi tipi che ereditano da questa tabella "SampleOne", "SampleTwo". Ho bisogno di una query come:Java/JPA | Query con tipo ereditato specificato

select s from Sample where s.type = :type 

dove tipo sarebbe un valore discriminante della tabella. E 'possibile in qualsiasi modo (ed evitare di creare una query di entità specifici, uno per ogni SampleOne, SampleTwo, ecc ...)

Io apprezzo molto ogni ingresso in questo argomento,

Cordiali saluti, P .

risposta

15

In JPA 2.0 è possibile utilizzare TYPE espressione (anche se attualmente non funziona con i parametri di Hibernate, vedere HHH-5282):

select s from Sample s where TYPE(s) = :type 

Il simile specifica espressione-Hibernate è .class:

select s from Sample s where s.class = :type 
+0

dispiace per iniziare una nuova discussione su soggetti simili, ma funziona se fornisco una classe astratta come: Tipo? –

+0

Secondo https://hibernate.atlassian.net/browse/HHH-4881 questo è stato corretto in Hibernate 4.0.0.CR5 –

3

Ecco il relevant section of the Java EE 6 tutorial:

astratte entità

Una classe astratta può essere dichiarata un'entità con decorando la classe con @Entity. Le entità astratte sono come le entità concrete ma non possono essere istanziate.

Le entità astratte possono essere interrogate solo come entità concrete come . Se un abstract entità è il bersaglio di una query, la query opera su tutti i concreti sottoclassi della entità astratta:

@Entity 
public abstract class Employee { 
    @Id 
    protected Integer employeeId; 
    ... 
} 
@Entity 
public class FullTimeEmployee extends Employee { 
    protected Integer salary; 
    ... 
} 
@Entity 
public class PartTimeEmployee extends Employee { 
    protected Float hourlyWage; 
} 

Se leggo questo diritto, la query:

select s from Sample where s.type = :type 

Dovrebbe restituire solo gli elementi del sottotipo specificato se type è la colonna discriminante, quindi l'unica cosa che rimane da fare è di trasmettere l'elenco dei risultati al sottotipo richiesto.

1

Devi ancora stare attento in Hibernate 4.3.7, perché c'è ancora un problema con l'implementazione di TYPE(), ad esempio:

from SpoForeignPilot sfp where TYPE(sfp.partDocument) = :type 

Questa query non funziona poiché controlla erroneamente il tipo di SpoForeignPilot e non il tipo del documento.

È possibile risolvere questo problema facendo qualcosa di simile a questo:

select sfp from SpoForeignPilot sfp join sfp.partDocument doc where TYPE(doc) = :type 
+0

Questo non aggiunge nulla di nuovo a una domanda di cinque anni. – meskobalazs

+2

Volevo solo avvisare le persone che vogliono utilizzare la soluzione proposta (usare TYPE in jpa 2) per query più complesse, c'è ancora un problema (ho riscontrato questo problema quando si utilizza la soluzione in questo thread). Hai ragione, che la query nella domanda non espone questo problema. –

+0

@WimDeRammelaere dopo ore di grattarmi la testa, la tua risposta mi ha aiutato a trovare il problema con la mia domanda. La linea di fondo è, quando ho usato ** tipo ** in una clausola where ha funzionato quando applicato a joins, ma non è stato possibile trovare alcun risultato quando utilizzato su un'espressione di percorso. – Maciek

Problemi correlati