我有一个映射到 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
没有 abc
和 xyz
,这是真的。基本上,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/