2015-06-09 1 views
4

Предполагая следующие классы сущностей и иерархию:JPA 2,0 CriteriaQuery с предикатом типа является классом или любым подклассом

@Entity 
Class Ticket { 

    @ManyToOne(optional = true) 
    private Customer customer;  

} 

@Entity 
Class Customer {} 

@Entity 
Class Person extends Customer {} 

@Class CustomPerson extends Person {} 

Как я могу запросить все билеты, которые имеют customer типа Person или любой подкласс Лицо (т.е. CustomPerson)?

Я могу легко создать предикат типа:

Predicate p = criteriaBuilder.equal(Ticket_...type(), criteriaBuilder.literal(Person.class)); 

, но это будет отфильтровывать CustomPerson.

Если есть generic способ справиться с этим (в JPA 2.0), я смог бы преодолеть проблему, если бы во время выполнения мог определить все сущности, расширяющие Person; В этом случае я мог бы использовать

Predicate p = criteriaBuilder.in(Ticket_...type(), listOfPersonSubclasses); 

ответ

0

Если нет простого способа в более новых версиях JPA, вы могли бы получить метаданные мэппинга от основной сессии и найти все отображенные подклассы программных (вы можете сделать это лениво и кэш результаты).

Чтобы получить сеанс:

org.eclipse.persistence.sessions.Session session = 
    ((org.eclipse.persistence.internal.jpa.EntityManagerImpl) 
       em.getDelegate()).getSession(); 
3

JPA 2.0 не предлагает общий путь, так что вы должны перечислить все подклассы, или изменить запрос таким образом, что он основан свой класс Person вместо , Например, "Select t from Person p, ticket t where t.customer=p"

JPA 2.1 представляет «лечение», которое позволяет вам сбрасывать и работать с объектом, как если бы это был определенный класс. Поскольку любой подкласс также является экземпляром, он фильтрует точно так, как вам кажется. https://wiki.eclipse.org/EclipseLink/Release/2.5/JPA21#Treat

Вы можете использовать его в качестве соединения или где положение, но пример может быть:

"Select t from Ticket t join treat(t.customer as Person) p" 
+0

Спасибо за ваш ответ @ Крис. Действительно, «Лечить» - это именно то, что мне нужно, но путь к JPA 2.1 для нас долгий. Не могли бы вы предоставить пример API-кода критериев для реализации упомянутого JPQL или рекомендаций для перечисления всех подклассов сущности объекта? – Cascader

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

  • Нет связанных вопросов^_^