【问题标题】:How do I query for only superclass entities in a jpql query?如何在 jpql 查询中仅查询超类实体?
【发布时间】:2011-04-15 12:32:23
【问题描述】:

我有以下实体:

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

查找 only 实体的 JPQL 语法是什么,这些实体 不是 RecurringOrderEntity 的实例?

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

谢谢!

【问题讨论】:

    标签: orm jpa eclipselink jpa-2.0 jpql


    【解决方案1】:

    仅查找不是 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
    

    【讨论】:

    • 有什么办法可以在不知道任何子类的情况下做到这一点?
    猜你喜欢
    • 2013-04-23
    • 1970-01-01
    • 2020-06-26
    • 2014-10-26
    • 2018-06-07
    • 2014-10-26
    • 2021-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多