【问题标题】:Select single item from database with Spring Hibernate Sessionfactory使用 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()最后,但是我必须在那里写什么,才能得到一个对象?

【问题讨论】:

    标签: java hibernate spring sessionfactory


    【解决方案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();
    

    【讨论】:

      猜你喜欢
      • 2011-11-18
      • 2014-12-19
      • 2012-12-20
      • 2011-12-28
      • 2020-11-23
      • 1970-01-01
      • 1970-01-01
      • 2021-07-18
      • 1970-01-01
      相关资源
      最近更新 更多