代码之家  ›  专栏  ›  技术社区  ›  Kyle Renfro

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

  •  8
  • Kyle Renfro  · 技术社区  · 14 年前

    我有以下实体:

    @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");
    

    用于查找的jpql语法是什么 只有 实体是 的实例 递归订单实体 ?

    我使用EclipseLink 2.0.0作为JPA提供程序。

    谢谢!

    1 回复  |  直到 14 年前
        1
  •  20
  •   Pascal Thivent    14 年前

    仅查找不是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实体类型表达式

    不能使用实体类型表达式 限制查询多态性。这个 类型运算符返回准确的类型 争论的焦点。

    实体类型的语法 表达式如下:

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

    实体\类型\文字 是 由实体名称指定。

    使用Java实体的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