我有一个问题,因为我试图访问一个空对象,不知道如何解决它,如果没有 hibernate 会检查 ResulSet 对象。next 不是 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)。 感谢您的帮助,非常感谢。
最佳答案
快速修复您的代码
在获取第一个元素之前,您需要检查列表是否为空。
更改此行:
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, Serialized)
(如果未找到则返回 null)或 Session#load(Class, Serialized)
(如果未找到,则抛出异常)。这样,您根本不必编写查询。像这样:
User user = (User) session.get(User.class, id);
关于mysql - Hibernate 选择空对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23555131/