我有一个映射到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
子句的混合具体类,但的项列表,具体取决于具体的类,put关于非共同财产的条件。类似于“让所有Item
我拥有i.common = 7,但如果他们是AbcItem
s,他们必须拥有abc = 5”。
使用from Item
查询所有项目很容易,我知道我可以使用.class
获取特定的课程。但我无法找到一种访问非共同属性或关联的方法。尝试from 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执行此操作,所以不要去那里打扰。
此外,我需要使用一个查询执行此操作。我知道我可以为每个类做单独的查询并合并结果。问题在于应用程序需要对由公共属性排序的“合并”结果进行分页。使用单独的查询执行此操作意味着加载大量不必要的项目,合并列表,对它们进行排序,然后丢弃大部分。对于页面N,我能想出的最佳算法需要为每个子查询加载前N页。)
答案 0 :(得分:3)
如果“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 ...