Jpa JPQL排除查询中的子类

Jpa JPQL排除查询中的子类,jpa,jpql,Jpa,Jpql,如果我有一个扩展了Fruit的类Apple,那么如何编写JPQL查询来返回严格意义上的Fruit而非Apple的所有对象呢?这在JPA2.0中可以使用TYPE操作符。来自JPA 2.0规范: 4.6.17.4实体类型表达式 可以使用实体类型表达式 限制查询多态性。这个 类型运算符返回确切的类型 这是争论的焦点 实体类型的语法 表达方式如下: entity_type_expression ::= type_discriminator | entity_type_li

如果我有一个扩展了Fruit的类Apple,那么如何编写JPQL查询来返回严格意义上的Fruit而非Apple的所有对象呢?

这在JPA2.0中可以使用
TYPE
操作符。来自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 ) 实体类型表达式::= U型鉴别器| 实体类型文字| 输入参数 类型识别器::= 类型(标识)变量| 单值对象路径表达式| 输入(U参数) 实体类型文字是 由实体名称指定

使用实体的Java类 作为输入参数来指定 实体类型

所以你可以这样做:

SELECT f
FROM Fruit f
WHERE TYPE(f) <> Apple
选择f
从水果f
其中(f)型苹果
但这在JPA1.0中不可用,如果您使用的是JPA1.0,则必须依赖于特定于提供商的扩展(在这种情况下请提及您的提供商)

工具书类
  • JPA2.0规范
    • 第4.4.8节“多态性”
    • 第4.6.17.4节“实体类型表达式”

请添加到原始源代码的链接,因为无法直观地理解