JPQL排除查询中的子类

时间:2010-10-20 22:24:30

标签: jpa jpql

如果我有一个扩展Fruit的Apple类,我如何编写一个JPQL查询来返回严格是Fruit而不是Apple的所有对象?

1 个答案:

答案 0 :(得分:4)

使用TYPE运算符可以在JPA 2.0中实现。从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 f
FROM Fruit f
WHERE TYPE(f) <> Apple

但这在JPA 1.0中不可用,如果您使用的是JPA 1.0,则必须依赖提供商特定的扩展(在这种情况下请提及您的提供商)。

参考

  • JPA 2.0规范
    • 第4.4.8节“多态性”
    • 第4.6.17.4节“实体类型表达式”