当前位置:编程学习 > JAVA >>

我用hibernateTemplate的find查询出现空指针异常

当查询的那一行数据的外键没有值时可以查得到,但外键有值时则报空指针异常,一下是hibernate的源码部分
public Number selectById(String id){
// TODO Auto-generated method stub

    String hql="from Number wherer id=?";//报错行
    List<Number> list=hibTemplate.find(hql,id);
    if(list.size()>0){
        return list.get(0);
    }else{
        return null;
    }

}
这里id是主键

一下是错误页面:
javax.servlet.ServletException: java.lang.NullPointerException
org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:518)
org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:421)

root cause

java.lang.NullPointerException
org.hibernate.tuple.AbstractEntityTuplizer.createProxy(AbstractEntityTuplizer.java:372)
org.hibernate.persister.entity.AbstractEntityPersister.createProxy(AbstractEntityPersister.java:3121)
org.hibernate.event.def.DefaultLoadEventListener.createProxyIfNecessary(DefaultLoadEventListener.java:232)
org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:173)
org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:87)
org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:862)
org.hibernate.impl.SessionImpl.internalLoad(SessionImpl.java:830)
org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:266)
org.hibernate.type.EntityType.resolve(EntityType.java:303)
org.hibernate.engine.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:116)
org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:842)
org.hibernate.loader.Loader.doQuery(Loader.java:717)
org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
org.hibernate.loader.Loader.doList(Loader.java:2145)
org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2029)
org.hibernate.loader.Loader.list(Loader.java:2024)
org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:375)
org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:308)
org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:153)
org.hibernate.impl.SessionImpl.list(SessionImpl.java:1106)
org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)
org.springframework.orm.hibernate3.HibernateTemplate$29.doInHibernate(HibernateTemplate.java:849)
org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:372)
org.springframework.orm.hibernate3.HibernateTemplate.find(HibernateTemplate.java:840)
org.springframework.orm.hibernate3.HibernateTemplate.find(HibernateTemplate.java:836)
com.etc.dao.NumberDAOHibernateTemplateImpl.selectById(NumberDAOHibernateTemplateImpl.java:19)
com.etc.service.NumberServiceImpl.delNum(NumberServiceImpl.java:32)
com.etc.action.NumberAction.deleteNumber(NumberAction.java:115) 异常 hql hibernateTemplate --------------------编程问答--------------------
引用 楼主 ouyang19910205 的回复:
当查询的那一行数据的外键没有值时可以查得到,但外键有值时则报空指针异常,一下是hibernate的源码部分
public Number selectById(String id){
// TODO Auto-generated method stub

    String hql="from Number wherer id=?";//报错行
    List<Number> list=hibTemplate.find(hql,id);
    if(list.size()>0){
        return list.get(0);
    }else{
        return null;
    }

}
这里id是主键

一下是错误页面:
javax.servlet.ServletException: java.lang.NullPointerException
org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:518)
org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:421)

root cause

java.lang.NullPointerException
org.hibernate.tuple.AbstractEntityTuplizer.createProxy(AbstractEntityTuplizer.java:372)
org.hibernate.persister.entity.AbstractEntityPersister.createProxy(AbstractEntityPersister.java:3121)
org.hibernate.event.def.DefaultLoadEventListener.createProxyIfNecessary(DefaultLoadEventListener.java:232)
org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:173)
org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:87)
org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:862)
org.hibernate.impl.SessionImpl.internalLoad(SessionImpl.java:830)
org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:266)
org.hibernate.type.EntityType.resolve(EntityType.java:303)
org.hibernate.engine.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:116)
org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:842)
org.hibernate.loader.Loader.doQuery(Loader.java:717)
org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
org.hibernate.loader.Loader.doList(Loader.java:2145)
org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2029)
org.hibernate.loader.Loader.list(Loader.java:2024)
org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:375)
org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:308)
org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:153)
org.hibernate.impl.SessionImpl.list(SessionImpl.java:1106)
org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)
org.springframework.orm.hibernate3.HibernateTemplate$29.doInHibernate(HibernateTemplate.java:849)
org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:372)
org.springframework.orm.hibernate3.HibernateTemplate.find(HibernateTemplate.java:840)
org.springframework.orm.hibernate3.HibernateTemplate.find(HibernateTemplate.java:836)
com.etc.dao.NumberDAOHibernateTemplateImpl.selectById(NumberDAOHibernateTemplateImpl.java:19)
com.etc.service.NumberServiceImpl.delNum(NumberServiceImpl.java:32)
com.etc.action.NumberAction.deleteNumber(NumberAction.java:115)




 String hql="from Number wherer id=?";//报错行
这个where写错了吧 --------------------编程问答-------------------- where写对了也是这样 --------------------编程问答--------------------  String hql="from Number wherer id=?";
这行怎么可能报空指针异常?,没有任何调用报空指针,真能说笑。你确认一下是哪行报错, --------------------编程问答-------------------- String hql="from Number wherer id=?";//报错行
    List<Number> list=hibTemplate.find(hql,id);

主键查询怎么这样了,肯定返回一条记录呀,用下面的方法试试。
Number num = hibTemplate.find(Number.class,id);

还有这里hibTemplate.find(hql,id);就算用hql查询,后面的参数应该是一个参数集合吧?好好看一下借口。 --------------------编程问答-------------------- 谢谢各位的解答,问题我已经找出来了,当然不是大家所说的本身的代码问题,这个代码是测试过的不存在疑问,因为之前做了几个demo测试了,只不过这次比较特殊涉及了有外键的表,解决方法是给hbm.xml中的many to one 加上lazy=false 那么问题就迎刃而解了,但原因不明,如果有懂的,还望帮我说明下 --------------------编程问答-------------------- String hql="from Number wherer id=?";
这一行怎么可能报错啊。。。报错的话也应该是这一行
 if(list.size()>0)
这么写是有问题的,应该这么写的:
if(list != null && list.size() > 0)
首先必须判断一下list是不是为空,如果为空了那么list.size()也没有意义啊,不报错就是怪事了。。。
还有就是你这里只要查不到数据,list就一定为空,并不是size() == 0,所以肯定会有异常,而不会去执行else的语句。。。 --------------------编程问答--------------------
引用 6 楼 hjw506848887 的回复:
String hql="from Number wherer id=?";
这一行怎么可能报错啊。。。报错的话也应该是这一行
 if(list.size()>0)
这么写是有问题的,应该这么写的:
if(list != null && list.size() > 0)
首先必须判断一下list是不是为空,如果为空了那么list.size()也没有意义啊,不报错就是怪事了。。。
还有就是你这里只要查不到数据,list就一定为空,并不是size() == 0,所以肯定会有异常,而不会去执行else的语句。。。



你可以试试查不到数据的情况下,  list!=null , list.isEmpty()==true; 
hibernate会帮你实例化list --------------------编程问答--------------------
引用 7 楼 q35335010 的回复:
Quote: 引用 6 楼 hjw506848887 的回复:

String hql="from Number wherer id=?";
这一行怎么可能报错啊。。。报错的话也应该是这一行
 if(list.size()>0)
这么写是有问题的,应该这么写的:
if(list != null && list.size() > 0)
首先必须判断一下list是不是为空,如果为空了那么list.size()也没有意义啊,不报错就是怪事了。。。
还有就是你这里只要查不到数据,list就一定为空,并不是size() == 0,所以肯定会有异常,而不会去执行else的语句。。。



你可以试试查不到数据的情况下,  list!=null , list.isEmpty()==true; 
hibernate会帮你实例化list

不是吧???我按你写的,怎么都是报空指针异常啊?开始我也以为是hibernateTemplate邦我实例化呢。。。但是不管怎么样,还是加上list !=null最好,毕竟不是空是前提。。。
--------------------编程问答--------------------
引用 7 楼 q35335010 的回复:
Quote: 引用 6 楼 hjw506848887 的回复:

String hql="from Number wherer id=?";
这一行怎么可能报错啊。。。报错的话也应该是这一行
 if(list.size()>0)
这么写是有问题的,应该这么写的:
if(list != null && list.size() > 0)
首先必须判断一下list是不是为空,如果为空了那么list.size()也没有意义啊,不报错就是怪事了。。。
还有就是你这里只要查不到数据,list就一定为空,并不是size() == 0,所以肯定会有异常,而不会去执行else的语句。。。



你可以试试查不到数据的情况下,  list!=null , list.isEmpty()==true; 
hibernate会帮你实例化list

擦,试过了,还真是你说的那样,奇怪了,以前怎么不是???难道以前不是这么写的??? --------------------编程问答--------------------
引用 9 楼 hjw506848887 的回复:
Quote: 引用 7 楼 q35335010 的回复:

Quote: 引用 6 楼 hjw506848887 的回复:

String hql="from Number wherer id=?";
这一行怎么可能报错啊。。。报错的话也应该是这一行
 if(list.size()>0)
这么写是有问题的,应该这么写的:
if(list != null && list.size() > 0)
首先必须判断一下list是不是为空,如果为空了那么list.size()也没有意义啊,不报错就是怪事了。。。
还有就是你这里只要查不到数据,list就一定为空,并不是size() == 0,所以肯定会有异常,而不会去执行else的语句。。。



你可以试试查不到数据的情况下,  list!=null , list.isEmpty()==true; 
hibernate会帮你实例化list

擦,试过了,还真是你说的那样,奇怪了,以前怎么不是???难道以前不是这么写的???




可能是你没注意吧 --------------------编程问答--------------------
引用 5 楼 ouyang19910205 的回复:
谢谢各位的解答,问题我已经找出来了,当然不是大家所说的本身的代码问题,这个代码是测试过的不存在疑问,因为之前做了几个demo测试了,只不过这次比较特殊涉及了有外键的表,解决方法是给hbm.xml中的many to one 加上lazy=false 那么问题就迎刃而解了,但原因不明,如果有懂的,还望帮我说明下


因为你用的是HibernateTemplate去 管理Session 一但执行完操作session 就会关闭了,不可以进行延迟加载查询,所以你如果通过外键值查询主键内容时 就需要在配置文件中加上lazy=“false” 也就是懒加载查询了 没有分析源码 个人见解 望指正  希望可以帮到你  --------------------编程问答--------------------
引用 11 楼 azjxb 的回复:
因为你用的是HibernateTemplate去 管理Session 一但执行完操作session 就会关闭了,不可以进行延迟加载查询,所以你如果通过外键值查询主键内容时 就需要在配置文件中加上lazy=“false” 也就是懒加载查询了 没有分析源码 个人见解 望指正  希望可以帮到你 

是 “非懒加载”吧?

如果存在外键就会去关联查询外键所关联表数据且如果是懒加载模式,因为此时session已关闭,所以会报空指针,是不是这样?
补充:Java ,  Java EE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,