我有一个映射到休眠状态的类层次结构,看起来像这样:
@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
子句,该子句根据特定的类将条件置于非公共属性上。类似于“获取具有i.common = 7的所有Item
i,但是如果它们是AbcItem
,则它们必须具有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来保持特定数据库引擎的独立性。去那里。
另外,我需要使用一个查询来执行此操作。我知道我可以为每个类进行单独的查询并合并结果。麻烦之处在于,应用程序需要对“合并”结果进行分页,并按通用属性排序。用单独的查询执行此操作将意味着装入大量不必要的项目,合并列表,对它们进行排序,然后丢弃其中的大部分。我想出的最佳算法要求对于第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 ...