使用Hibernate的session.createSQLQuery()更新MySQL DATETIME列时触发空指针异常
解决Hibernate中使用
session.createSQLQuery()时出现的NullPointerException问题 你在尝试通过Hibernate原生SQL更新MySQL的DATETIME字段时遇到了空指针异常,我来帮你梳理下问题和解决办法:
问题核心原因
看你的AccountDAO代码,你只是声明了Session session;变量,但完全没有对它进行初始化赋值!当你调用session.createSQLQuery()时,session对象还是null状态,这必然会抛出java.lang.NullPointerException。
修复方案
你已经注入了HibernateTemplate,完全可以通过它来获取合法的Session实例,不用单独声明未初始化的Session变量。修改后的insertLogoutTime方法如下:
public int insertLogoutTime(int srNum, String userName) { System.out.println("------>Inside AccountDAO<------"); System.out.println("*************-- In insertLogoutTime() Method--************"); try{ Date now = new Date(); // 通过HibernateTemplate关联的SessionFactory获取当前Session Session session = template.getSessionFactory().getCurrentSession(); Query query=session.createSQLQuery("update login_info set Logout_DateTime =:theDate where SrNum=:srNum"); query.setParameter("theDate", now); query.setParameter("srNum", srNum); returnValue= query.executeUpdate(); System.out.println(returnValue); // 返回实际更新行数,不要固定返回0 return returnValue; } catch(Exception e) { e.printStackTrace(); return 0; } }
另外还有两个小细节优化:
- 你原来的代码最后固定返回
0,会覆盖实际的更新结果,建议在try块返回returnValue,catch块返回0更合理; - 无需手动格式化Date,Hibernate会自动将
java.util.Date转换为MySQL的DATETIME类型,直接传入Date对象即可。
更贴合Spring+Hibernate的写法
如果你想遵循Spring整合Hibernate的最佳实践,也可以直接用HibernateTemplate的execute方法执行SQL,避免手动管理Session生命周期:
public int insertLogoutTime(int srNum, String userName) { System.out.println("------>Inside AccountDAO<------"); System.out.println("*************-- In insertLogoutTime() Method--************"); Date now = new Date(); return template.execute(session -> { Query query = session.createSQLQuery("update login_info set Logout_DateTime =:theDate where SrNum=:srNum"); query.setParameter("theDate", now); query.setParameter("srNum", srNum); return query.executeUpdate(); }); }
这样Spring会自动帮你处理Session的打开、关闭等操作,减少手动出错的可能。
内容的提问来源于stack exchange,提问作者Pankaj Dagar
相关产品推荐
相关产品推荐

