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