5

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

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

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

现在,我想获取对象 A 中列的最大值,但仅在关系属于特定子类型的情况下,即...Y。

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

我在想类似的东西:

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

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

任何帮助将非常感激。

4

2 回答 2

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
于 2010-06-02T14:13:52.040 回答
0

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

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

希望它有帮助,安东

于 2010-06-02T13:46:30.693 回答