我有一个问题,因为我正在尝试访问一个空对象,不知道如何解决它,没有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)。 感谢您的帮助,非常感谢。
答案 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);