使用 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 从数据库中选择单个项目的主要内容,如果未能解决你的问题,请参考以下文章