Mysql 休眠选择空对象
我遇到了一个问题,因为我正在尝试访问一个空对象,不知道如何解决它,如果没有hibernate,我将检查ResultSet对象。下一步不是0,但在hibernate中,我尝试执行此操作但没有成功: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();
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{…}