【发布时间】:2010-06-17 13:46:01
【问题描述】:
我有一个对象“响应”,它有一个名为“提交者”的属性。提交者可以是几个不同的班级之一,包括学生、教师等......
我希望能够执行一个条件查询,其中我只选择教师提交的回复 - 所以这意味着对关联实体施加类限制。对此有什么想法吗?我想远离直接 SQL 或 HQL。
【问题讨论】:
我有一个对象“响应”,它有一个名为“提交者”的属性。提交者可以是几个不同的班级之一,包括学生、教师等......
我希望能够执行一个条件查询,其中我只选择教师提交的回复 - 所以这意味着对关联实体施加类限制。对此有什么想法吗?我想远离直接 SQL 或 HQL。
【问题讨论】:
According to Gavin King,以下适用于 HQL:
where foo.class in (...)
你试过了吗
c.createCriteria("submitter").add(Restrictions.eq("class", Teacher.class))
?
【讨论】:
c.createCriteria("submitter").add(Restrictions.in("class",new Class[]{CommunityHealthWorker.class}));,只是因为 Gavin 说“foo.class 在哪里”
in 而不是eq,因为 instanceof 也接受子类型,但 eq 不接受。因此,如果教师是抽象的,无论是 RegularTeacher 还是 SubstituteTeacher,你都需要 in(RegularTeacher.class, SubstituteTeacher.class) 来表达 instanceof Teacher。
我最终使用了本机 SQL。不是最棒的,但也不可怕:
Criteria c = session.createCriteria(Response.class);
c.createCriteria("submitter").add(Restrictions.sqlRestriction("{alias}.person_type='student'"));
值得注意的是,这只是因为我使用的是 table-per-inheritance-hierarchy 映射策略。没有它,我就不会有一个鉴别器列。
【讨论】: