在我的模型中,我有一个抽象的“ User”类,以及多个子类,例如Applicant,HiringManager和Interviewer。它们在一个表中,我只有一个DAO来管理它们。
用户:
@Entity @Table(name="User") @Inheritance(strategy=InheritanceType.SINGLE_TABLE) @DiscriminatorColumn( name="role", discriminatorType=DiscriminatorType.STRING ) public abstract class User extends BaseObject implements Identifiable<Long> ...
HiringManager(例如):
@Entity @DiscriminatorValue("HIRING_MANAGER") public class HiringManager extends User ...
现在,如果我想得到所有与部门无关的招聘经理,我该怎么做?我想它看起来像:
DetachedCriteria c = DetachedCriteria.forClass(User.class); c.add(Restrictions.eq("role", "HIRING_MANAGER")); c.add(Restrictions.isNull("department")); List<User> results = getHibernateTemplate().findByCriteria(c);
但是,当我运行此代码时,Hibernate抱怨“无法解析属性:角色”(这实际上是有道理的,因为User类实际上没有显式的角色属性), 那么做我想做的事情的正确方法是什么?
我可能会遗漏一些明显的东西,但是既然您想找到招聘经理,为什么不将HiringManager子类作为类传递给Criteria?
HiringManager
Criteria
以防万一,有一个特殊的class属性可用于将查询限制为子类型。从Hibernate参考文档中:
class
14.9。where子句 … class在多态持久性的情况下,特殊属性访问实例的鉴别符值。嵌入where子句中的Java类名称将转换为其鉴别值。 from Cat cat where cat.class = DomesticCat
14.9。where子句
…
class在多态持久性的情况下,特殊属性访问实例的鉴别符值。嵌入where子句中的Java类名称将转换为其鉴别值。
from Cat cat where cat.class = DomesticCat
您也可以在Criteria API中使用这个特殊的类属性,但是需要做一点改动:您必须使用 鉴别值 作为值。
c.add(Restrictions.eq("class", "HIRING_MANAGER"));
与HQL不同,Hibernate似乎没有使用Criteria API进行转换。我不太喜欢在代码中使用鉴别值的想法,也许还有另一种更简洁的方法,但我不知道。但这有效。