2013-08-05 13 views
6

Mam modelu trwałości, jak ten:JPA zapytań na podklasy klasy abstrakcyjnej + stan pola

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

chciałbym zapytać Pracownikom warunkach klasowych Somes dzieci, na przykład: pensja> 1000.

Próbowałem tego, ale nie działa.

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; 

Próbowałem również umieścić metodę abstrakcyjną w Employee i użyć jej w zapytaniu, ale również nie działa.

Czy możesz mi pomóc?

Dzięki,

Odpowiedz

8

Ok, znalazłem rozwiązanie. Nie sądzę, że jest to najlepsze ze względu na połączenia wielokrotności w ostatecznym natywnym zapytaniu. Ale działa.

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

Edycja:

znaleźć inne rozwiązanie, które jest CZĘŚĆ szybciej niż to powyżej 200K rzędach. Korzystanie z zagnieżdżonych wybiera w klauzuli WHERE:

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²:

Wydaje się, że nie muszę już się nie przyłączyć z ostatniej wersji Hibernate (obecnie 4.3.10.Final).

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

powinien działać

+0

Wielkie rozwiązania. Drugi jest szczególnie przydatny w moim przypadku, w którym miałem już dwa oddzielne zapytania, ale musiałem je połączyć w jeden. –

Powiązane problemy