如何在jpql查询中仅查询超类实体?

时间:2010-09-22 02:39:31

标签: orm jpa eclipselink jpa-2.0 jpql

我有以下实体:

@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{
...

我可以使用以下jpql找到所有子类(RecurringOrderEntity):

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

用于查找 RecurringOrderEntity 实例的实体的JPQL语法是什么?

我使用Eclipselink 2.0.0作为JPA提供商。

谢谢!

1 个答案:

答案 0 :(得分:20)

  

用于查找不是RecurringOrderEntity实例的实体的JPQL语法是什么?

将实体类型表达式与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