2011-09-16 79 views
8

选择从数据库单一项目这是我的DAO:与Spring的SessionFactory

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

这得到所有从表天气的元素。但可以说我想要做这样的事(我想从表天气只有一个元素):

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

我知道不应该在年底list(),但我必须在里面写了什么,得到只有一个对象?

回答

11

如果你有一个id,你只是用得到:

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

如果你需要做一个查询,是你必须抢在结果集的顶部,也可以使用uniqueResult()查询。

+1

UniqueResult()是一个对象,你会如何处理天气和普通对象的区别?我应该疯狂地把它投向天气吗?或者有更合适的方法? – Jaanus

+2

是的,你投了它。使用查询编译时间类型安全性是没有的。编译器应该如何知道你的HQL语句最终会创建什么? – Affe

+0

但是,当我有别的东西比ID,例如一些整数字段,这是否工作? – Jaanus

7

获取列表有什么问题吗? :)即使你知道只有一个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)); 
} 
+0

是的,我想过要获得列表,但我想是否有也是另一种方式。尽管如此,我应该如何处理DAO中从List到Weather的变化,或者只是在我的视图中处理它,通过获取列表的第一个元素?这将是正确的使用? – Jaanus

+0

嗯,这真的取决于你,但除非你想让列表始终返回到你的视图,否则我会在DAO级别执行此操作。此外,方法名称建议您只需要当前天气,以便稍后使用您的代码的其他人可能会对列表返回的原因感到困惑 –

0

您需要使用标准的API如下:

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

    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); 
     List results = query.list(); 
相关问题