我有以下实体:
@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提供商。
谢谢!
答案 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