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运算符返回参数的确切类型.
实体类型表达式的语法如下:
Run Code Online (Sandbox Code Playgroud)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类用作输入参数以指定实体类型.
例子:
Run Code Online (Sandbox Code Playgroud)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类名将被转换为其鉴别器值.Run Code Online (Sandbox Code Playgroud)from Cat cat where cat.class = DomesticCat
所以在你的情况下,我会尝试这样的事情:
SELECT MAX(a.columnName) FROM A a where a.x.class = Y
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
5603 次 |
最近记录: |