使用 Spring Hibernate Sessionfactory 从数据库中选择单个项目

Posted

技术标签:

【中文标题】使用 Spring Hibernate Sessionfactory 从数据库中选择单个项目【英文标题】:Select single item from database with Spring Hibernate Sessionfactory 【发布时间】:2011-11-18 18:58:20 【问题描述】:

这是在我的 DAO 中:

public List<Weather> getCurrentWeather()   
    return sessionFactory.getCurrentSession().createQuery("from Weather").list();

这会从表 Weather 中获取所有元素。但是可以说我想做这样的事情(我只想要表 Weather 中的一个元素):

public Weather getCurrentWeather()     
    return sessionFactory.getCurrentSession().createQuery("from Weather where id = 1").list(); // here should be something else than list()

我知道不应该有list()最后,但是我必须在那里写什么,才能得到一个对象?

【问题讨论】:

【参考方案1】:

如果你有一个 id,你只需使用 get:

public Weather getCurrentWeather()     
    return sessionFactory.getCurrentSession().get(Weather.class, 1); 

如果您确实需要进行查询,是的,您必须获取结果集的顶部,或者您可以在查询中使用uniqueResult()

【讨论】:

UniqueResult() 是一个对象,你将如何处理 Weather 和普通对象的差异?我应该疯狂地将它投射到天气吗?还是有更合适的方式? 是的,你投了。没有查询的编译时类型安全之类的东西。编译器应该如何知道你的 HQL 语句最终将创建什么? 但是当我有除 ID 以外的其他东西时,这是否有效,例如一些整数字段? get 仅适用于 id。建议尽可能多地使用它,因为它会进入 L1 缓存。如果您有严格的请求范围并且确保每次会话只能获得一次,那可能无关紧要。如果您想避免强制转换,您可以使用 Criteria API 来构建您的查询,而不是写出 HQL。 第一个选项也需要铸造吗? (Weather.class, 1) 不是返回 Weather 类吗?【参考方案2】:

获取列表有什么问题吗? :) 即使您知道只有 1 个 hibernate 也不能假设。无论如何,获取清单更安全!

public Weather getCurrentWeather()     
    List<Weather> list = sessionFactory.getCurrentSession().createQuery("from Weather where id = 1").list(); // here should be something else than list()
    return (list.isEmpty() ? null : list.get(0));

【讨论】:

是的,我考虑过获取列表,但我想是否还有其他方法。不过,我应该像您一样在 DAO 中处理从 List 到 Weather 的更改,还是在我看来,通过获取列表的第一个元素来处理它?哪个是正确的用途? 这完全取决于您,但除非您希望列表一直返回到您的视图中,否则我会在 DAO 级别执行此操作。此外,方法名称表明您只需要当前天气,以便以后使用您的代码的其他人可能会对返回列表的原因感到困惑【参考方案3】:

您需要使用 Criteria API 如下:

    List<LeaveManagement> leaveManagements =      session.createCriteria(LeaveManagement.class)
            .add( Restrictions.isNull("approvedTimeStamp") )
            .uniqueResult();

    If you want to write a hql query you can write as:

    String hql = "from LeaveManagement where approvedTimeStamp is null";
         Query query = session.createQuery(hql);
        LeaveManagement results = (LeaveManagement) query.uniqueResult();

【讨论】:

以上是关于使用 Spring Hibernate Sessionfactory 从数据库中选择单个项目的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate框架的总结

Spring Data Jpa系列教程--------实体解析和关联关系

Hibernate5.x缓存机制

Hibernate框架

Hibernate工作原理及其优点

JAVA Hibernate工作原理及为什么要用