休眠选择空对象

时间:2014-05-09 01:08:47

标签: mysql hibernate select indexoutofboundsexception

我有一个问题,因为我正在尝试访问一个空对象,不知道如何解决它,没有hibernate会检查ResulSet对象。下一个不是0,但这里有Hibernate,我正在尝试做这没有成功:

public User buscaHotel(int id){

    User user =null;
    SessionFactory sf = open();
    Session ss=sf.openSession();
    ss.beginTransaction();      
    Query query = ss.createQuery("from User_table where userId = :id ");
    query.setParameter("id", id);
    List<?> list = query.list();
    if (list != null){
        System.out.println("Not NULL");
    user = (User)list.get(0);
    ss.getTransaction().commit();
    ss.close();
    return user;
    }
    else {
    ss.getTransaction().commit();
    ss.close();
    return user;
    }
}

当我发送一个不在表中的id时,我得到了错误数组索引超出范围,因为它输入了if(list!= null)。 感谢您的帮助,非常感谢。

1 个答案:

答案 0 :(得分:0)

快速修复代码

在获取第一个元素之前,您需要检查列表是否为空。

更改此行:

user = (User)list.get(0);

对此:

if(list.size() > 0) user = (User)list.get(0);

更好的解决方案

如果您希望只返回一个记录/实体,则可以使用Query#uniqueResult()。然后您不必担心处理列表,如下所示:

User user = (User) query.uniqueResult();

请注意,如果实际返回了多条记录,uniqueResult()将抛出异常。

但是,通过id获取单个实体的典型方法是使用Session#get(Class, Serializable)(如果未找到则返回null)或Session#load(Class, Serializable)(如果未找到则抛​​出异常) 。这样,您根本不必编写查询。像这样:

User user = (User) session.get(User.class, id);