我在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的子类...所以我有点迷失。
非常感谢任何帮助。
答案 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
希望它有所帮助, 安东