hibernate - 具有具体类特定属性条件的多态 HQL 查询;可以做到吗?

标签 hibernate polymorphism hql

我有一个映射到 hibernate 的类层次结构,看起来有点像这样:

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public abstract class Item { @ManyToOne Common common; ... }

@Entity
public class AbcItem extends Item { @ManyToOne Abc abc; ... }

@Entity
public class XyzItem extends Item { @ManyToOne Xyz xyz; ... }

也就是说,几个具体类共享一些关联,但又各自有额外的个体关联。 (因为我使用的是单个表,所以类不使用的列只是 NULL。)

我想要的是能够使用 HQL 查询混合具体类的项目列表,但是带有一个 where 子句,这取决于具体类,对非公共(public)属性设置条件。类似于“获取所有 i.common = 7 的 Item,但如果它们是 AbcItem,则它们必须具有 abc = 5”。

使用 from Item 查询所有项目很容易,而且我知道我可以使用 .class 获取特定的类。但是我想不出一种访问非公共(public)属性或关联的方法。尝试从 Item i where (i.class = AbcItem and i.abc = 5) or (i.class = XyzItem and i.xyz = 7) 导致 Hibernate 提示 Item 没有 abcxyz,这是真的。基本上,HQL 似乎有一个 instanceof 但没有强制转换。

我错过了什么吗?

(注意:我正在尝试在 HQL 中执行此操作 或者如果可能的话甚至使用 Criteria 查询 -而不是原生 SQL 以保持某种程度独立于特定的数据库引擎。我知道如何使用原生 SQL 执行此操作,所以不要懒得去那里了。

此外,我需要使用一个 查询来执行此操作。我知道我可以对每个类进行单独查询并合并结果。这样做的问题是应用程序需要对“合并”的结果进行分页,按公共(public)属性排序。使用单独的查询来执行此操作意味着加载大量不必要的项目,合并列表,对它们进行排序,然后丢弃其中的大部分。我能想到的最佳算法要求,对于第 N 页,为每个子查询加载前 N 页。)

最佳答案

如果“id”是主键:

from Item i
where (
   i.id in (select i2.id from AbcItem i2 where i2.abc = 5)
   or i.id in (select id2.id from XyzItem i2 where i2.xyz = 7)
   )
and ...
order by ...

关于hibernate - 具有具体类特定属性条件的多态 HQL 查询;可以做到吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8495936/

相关文章:

java - 如何避免查询调用关联对象

java - HIbernate OneToMany FetchType.EAGER 不返回值

java - Hibernate 示例查询的格式不正确

java - 无法从接口(interface)实现子类中的方法

c++ - 扩展基类并在不更改派生类的情况下使用该功能

Java——继承和多态

hibernate - 使用 HQL 仅连接第一行

java - 具有两个角色的一个用户的输出

java - 如何在hibernate注释中删除带有父键的子表记录?

java - 如何在 HQL 中使用 sql case 子句?