2013-08-05 10 views
6

Ho un modello di persistenza come questo:di query JPA sulla classe astratta + sottoclasse condizione campo

@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; 
} 

Vorrei interrogare dipendenti condizioni di classe Somes bambini, per esempio: stipendio> 1000.

L'ho provato ma non funzionante.

SELECT e 
FROM Employee e 
WHERE e.salary > 1000; 

SELECT e 
FROM Employee e 
WHERE (TYPE(e) = FullTimeEmployee AND e.salary > 1000) 
OR TYPE(e) = PartTimeEmployee; 

Ho anche provato a inserire un metodo astratto in Dipendente e utilizzarlo nella query ma non funziona.

Potrebbe aiutarmi per favore?

Grazie,

risposta

8

Ok, ho trovato una soluzione. Non penso che sia il migliore a causa dei multipli join nella query nativa finale. Ma sta funzionando.

SELECT e 
FROM Employee e, FullTimeEmployee f, PartTimeEmployee p 
WHERE (e = f AND f.salary > 1000) 
OR (e = p ...); 

EDIT:

trovato un'altra soluzione che è un LOT più veloce di quello sopra con 200k righe. Utilizzando seleziona annidati nella clausola dove:

SELECT e 
FROM Employee e 
WHERE e.employeeId IN (SELECT f.employeeId FROM FullTimeEmployee f WHERE f.salary > 1000) 
OR e.employeeId IN (SELECT p.employeeId FROM PartTimeEmployee p WHERE ...) 

EDIT²:

Sembra che non ho bisogno di fare aderire più con l'ultima versione di Hibernate (attualmente 4.3.10.Final).

SELECT e 
FROM Employee e 
WHERE e.salary IS NULL 
OR e.salary > 1000 

dovrebbe funzionare

+0

grandi soluzioni. Il secondo è particolarmente utile nel mio caso, dove avevo già scritto due query separate, ma dovevo metterle insieme in una sola. –

Problemi correlati