You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:15:44