当前位置: 首页 > 面试题库 >

使用条件查询检索多态休眠对象

杨晟
2023-03-14
问题内容

在我的模型中,我有一个抽象的“
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

以防万一,有一个特殊的class属性可用于将查询限制为子类型。从Hibernate参考文档中:

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进行转换。我不太喜欢在代码中使用鉴别值的想法,也许还有另一种更简洁的方法,但我不知道。但这有效。



 类似资料:
  • 问题内容: 在我当前的项目中,我遇到了使用hibernate条件查询获取实体的问题。我有以下实体: 教授,其中包含学生名单 学生,其中包含作业列表。 作业,其中包含分配到的学生的ID。 现在,我想获得与教授有关的所有作业,即教授分配给他的学生的所有作业。 此查询显示我要在条件查询中实现的内容。 如何使用hibernate条件API实施此查询? 问题答案: 假设您的表格是这样的: 使用别名的简单示例

  • 问题内容: 我有一堂课; 我还有一节课; 我将如何搜索Student ,名字John,lastName Doe? 如果是出生日期属性,我将在日期上创建一个并添加一个相等限制()。我将如何对AppUser对象中的lastName和firstName进行操作? 问题答案: 查询: 要使用条件,请检查此线程 还可以从hibernate文档中查看此页面

  • 问题内容: 我需要使用detachedCriteria进行此SQL查询: 这个想法是从不属于用户的游戏中获取ID。我尝试了与detachedCriteria类似的10种不同方法,但得到了“未知实体:null” MappingException代码应类似于: 还设置投影以仅返回游戏的ID。 有任何想法吗?我认为Hibernate在加入没有别名的查询时会遇到一些麻烦。添加别名是可行的,但结果是完全错误

  • 问题内容: 任何使用条件/ hql / sql告诉我查询的人。要求是用户输入电子邮件或用户名查询从表user返回用户的密码。 问题答案: 如果您正在做的只是获取一个字段,那么您可能只想执行hql(或者可能是sql)。 如果您符合条件,我相信您将撤回整个对象,只是为了最终使用一个字段。 编辑: 这是一个非常广泛的问题。这是一个教程

  • 问题内容: 我不确定如何描述这个问题,所以我认为举个例子是问我问题的最好方法: 我有两个表具有多对多关系: 驾驶员许可证<->许可证类别 LicenceClass是诸如“汽车”,“摩托车”和“中型刚性”之类的东西。 使用Hibernate Criteria,如何找到同时具有“汽车”和“摩托车” LicenceClasses的所有许可证? 2008年12月11日更新我发现可以使用自定义ResultT

  • 问题内容: 我正在尝试运行一个更新查询,它将在sql中看起来像这样: 我正在尝试使用 Criteria 这样重新创建查询: 这行不通,因为满足该条件的行很多,我的独特结果是我猜这里的问题。如何将其转换为符合条件的所有行的更新。我不想使用HQL查询,而是使用Criteria来执行。 问题答案: 始终建议执行批量操作非常接近数据库,除非需要,否则我们不需要在会话中保留更新的对象,因此,在执行批量操作时