gpt4 book ai didi

sql - jpa 对子类的连接查询

转载 作者:行者123 更新时间:2023-12-04 16:49:45 26 4
gpt4 key购买 nike

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

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

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

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

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

我在想这样的事情:

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

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

任何帮助将非常感激。

最佳答案

JPA 2.0 允许查询使用 TYPE 运算符限制从多态查询返回的类。从 JPA 2.0 规范:

4.6.17.4 Entity Type Expressions

An entity type expression can be used to restrict query polymorphism. The TYPE operator returns the exact type of the argument.

The syntax of an entity type expression is as follows:

entity_type_expression ::=
type_discriminator |
entity_type_literal |
input_parameter
type_discriminator ::=
TYPE(identification_variable |
single_valued_object_path_expression |
input_parameter )

An entity_type_literal is designated by the entity name.

The Java class of the entity is used as an input parameter to specify the entity type.

Examples:

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 :

Likewise, the special property class accesses the discriminator value of an instance in the case of polymorphic persistence. A Java class name embedded in the where clause will be translated to its discriminator value.

from Cat cat where cat.class = DomesticCat


所以在你的情况下,我会尝试这样的事情:
SELECT MAX(a.columnName) FROM A a where a.x.class = Y

关于sql - jpa 对子类的连接查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2957271/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com