jpa连接查询子类

Bri*_*ian 5 sql polymorphism hibernate jpa polymorphic-associations

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

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

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

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

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

我想的是:

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

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

任何帮助将非常感激.

Pas*_*ent 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 )
Run Code Online (Sandbox Code Playgroud)

一个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
Run Code Online (Sandbox Code Playgroud)

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

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

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

from Cat cat where cat.class = DomesticCat
Run Code Online (Sandbox Code Playgroud)

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

SELECT MAX(a.columnName) FROM A a where a.x.class = Y
Run Code Online (Sandbox Code Playgroud)

  • 感谢Pascal彻底而明确的答案!真的很感激! (2认同)

小智 0

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

SELECT MAX(a.columnName) FROM A a join ax WHERE axclass = y.class

希望有帮助,安东