Mysql 休眠选择空对象

Mysql 休眠选择空对象,mysql,hibernate,select,indexoutofboundsexception,Mysql,Hibernate,Select,Indexoutofboundsexception,我遇到了一个问题,因为我正在尝试访问一个空对象,不知道如何解决它,如果没有hibernate,我将检查ResultSet对象。下一步不是0,但在hibernate中,我尝试执行此操作但没有成功: public User buscaHotel(int id){ User user =null; SessionFactory sf = open(); Session ss=sf.openSession(); ss.beginTransaction();

我遇到了一个问题,因为我正在尝试访问一个空对象,不知道如何解决它,如果没有hibernate,我将检查ResultSet对象。下一步不是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列表=无效的 非常感谢您的帮助。

代码的快速修复 在获取第一个元素之前,需要检查列表是否为空

更改此行:

user = (User)list.get(0);
为此:

if(list.size() > 0) user = (User)list.get(0);
更好的解决方案 当您希望只返回一个记录/实体时,可以使用QueryuniqueResult。这样,您就不必担心如何处理列表,如下所示:

User user = (User) query.uniqueResult();
请注意,如果实际返回了多条记录,uniqueResult将抛出异常

但是,按id获取单个实体的典型方法是使用SessiongetClass,Serializable在未找到时返回null,或者SessionloadClass,Serializable在未找到时抛出异常。这样,您根本不必编写查询。像这样:

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

列表永远不会为空,但可以为空。改为检查list.size如何?这就解决了问题,太好了;最好的方法是始终检查是否为空,大小是否为0,如下所示:if list!=null&&list.size>0{…}