jpa连接查询子类

时间:2010-06-02 11:38:21

标签: sql hibernate jpa polymorphism polymorphic-associations

我在JPA(hibernate)中有以下关系。

对象X有两个子类,Y和Z。

对象A与对象X具有manyToOne关系。(注意,这是一个单侧关系,因此对象X无法看到对象A)。

现在,我想获取对象A中列的最大值,但仅限于关系是特定子类型的位置,即... Y。

因此,这相当于...在对象A中获取column1的最大值,跨越所有与A有关系的A实例。这可能吗?我有点迷失如何查询它。

我想的是:

String query = "SELECT MAX(a.columnName) FROM A a join a.x;
Query query = super.entityManager.createQuery(query);
query.execute();

然而,这并没有考虑到X的子类...所以我有点迷失。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:14)

JPA 2.0允许查询使用TYPE运算符限制从多态查询返回的类。从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

JPA 1.0没有提供这样的机制,所以如果你使用的是JPA 1.0,那么使用标准的JPQL是不可能的。

如果您不介意使用专有的HQL,那么您可以使用特殊属性class

  

同样,特殊属性class在多态持久性的情况下访问实例的鉴别器值。嵌入在where子句中的Java类名将被转换为其鉴别器值。

from Cat cat where cat.class = DomesticCat

所以在你的情况下,我会尝试这样的事情:

SELECT MAX(a.columnName) FROM A a where a.x.class = Y

答案 1 :(得分:0)

我没有测试过,但尝试这样的事情:

SELECT MAX(a.columnName)FROM一个连接a.x WHERE a.x.class = y.class

希望它有所帮助, 安东