2013-11-11 4 views
1

У меня есть класс, содержащий Person поле age, класс Student расширяет Person, содержащее поле class и класс Teacher расширяет Person и содержащее поле salary.фильтра, используя поле от дочернего объекта

Я хочу получить все Лица, которые находятся в классе X, если они Студенты, и зарабатывать 1500 $, если они Учитель, используя тот же самый запрос jpql. Запрос должен вернуть список Person. Я могу сделать два запроса и сделать метод, который вызывает запрос и присоединяется к результату, но есть лучшее решение.

Я надеюсь, что я был в состоянии объяснить

+0

Вы пробовали 'select p from Person p где p.salary = 1500 или p.clazz = 'X''? AFAIK, по крайней мере, с Hibernate, это будет работать нормально. –

+0

нет, у меня нет, но можно ли работать таким простым способом. Я попробую. – amir

ответ

1

Используйте «TYPE» и JPA 2.1 «Относись» для фильтрации по классу.

"SELECT p from Person p where treat(p as Teacher).salary = 1500 or TYPE(p) = Student" 

Если вы не можете использовать JPA 2.1, вы можете использовать подзапрос на Учителя, чтобы вернуться иды учителя с зарплатой = 1500, и использовать результат в основном запросе.

"SELECT p from Person p where p.id in(SELECT t.id from Teacher t where t.salary=1500) or TYPE(p) = Student" 
+0

Я думаю, вы имеете в виду JPA 2.1. Я не видел упоминания о TREAT в спецификации JPA 2.0. +1 хотя. –

+0

Спасибо, что поймали это. – Chris

+0

Я использую glassfish 3.1.2, который поддерживает jpa 2.0, поэтому мне нужно сменить сервер приложений правильно? – amir

Смежные вопросы