Как запросить только сущности суперкласса в запросе jpql? - PullRequest
8 голосов
/ 22 сентября 2010

У меня есть следующие объекты:

@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="orderType", discriminatorType=DiscriminatorType.STRING)
@DiscriminatorValue(value="BASE")
@Table(name = "orders")
public class OrderEntity implements Serializable {
...

и

@Entity
@DiscriminatorValue(value="RECURRING")
public class RecurringOrderEntity extends OrderEntity{
...

Я могу найти все подклассы (RecurringOrderEntity) со следующим jpql:

Query q = em.createQuery(
                "SELECT o from RecurringOrderEntity o where "
                + "o.cancellationDate is null "
                + "and o.maxOccurrences = o.occurrence");

Что такое синтаксис JPQL для поиска только сущностей, которые не экземпляров RecurringOrderEntity ?

Я использую Eclipselink 2.0.0 в качестве поставщика JPA.

спасибо!

1 Ответ

20 голосов
/ 22 сентября 2010

Что такое синтаксис JPQL для поиска только сущностей, которые не являются экземплярами RecurringOrderEntity?

Используйте выражение типа сущности с оператором TYPE. Примерно так (не уверен насчет именно того запроса, который вы хотите, но вы поняли):

SELECT o 
FROM OrderEntity o 
WHERE TYPE(o) <> RecurringOrderEntity
  AND o.cancellationDate is null
  AND o.maxOccurrences = o.occurrence

Ниже приведен соответствующий раздел спецификации JPA 2.0:

4.6.17.4 Выражения типов сущностей

Можно использовать выражение типа объекта ограничить полиморфизм запросов. Оператор TYPE возвращает точный тип аргумента.

Синтаксис типа сущности Выражение выглядит следующим образом:

entity_type_expression ::=
       type_discriminator |
       entity_type_literal |
       input_parameter
type_discriminator ::=
       TYPE(identification_variable |
            single_valued_object_path_expression |
            input_parameter )

entity_type_literal является обозначается именем организации.

Используется класс Java объекта в качестве входного параметра для указания тип сущности.

Примеры:

SELECT e
FROM Employee e
WHERE TYPE(e) IN (Exempt, Contractor)

SELECT e
FROM Employee e
WHERE TYPE(e) IN (:empType1, :empType2)

SELECT e
FROM Employee e
WHERE TYPE(e) IN :empTypes

SELECT TYPE(e)
FROM Employee e
WHERE TYPE(e) <> Exempt
...