SessionFactoryImpl中的空指针异常#getReturnTypes on delete

时间:2012-09-25 06:48:54

标签: java database hibernate nullpointerexception

此行抛出一个植根于SessionFactoryImpl#getReturnTypes方法的NPE:

    Query q = em.createQuery("DELETE FROM Table t WHERE row = :row"), Table.class);

更具体地说,返回空值的方法是HQLQueryPlan#getReturnMetadata(),这就是SessionFactoryImpl#getReturnTypes中此指令失败的原因:

return queryPlanCache.getHQLQueryPlan( queryString, false, CollectionHelper.EMPTY_MAP ).getReturnMetadata().getReturnTypes();

由于某种原因,该表上的选择工作正常,我记得在同一个表上也看到了删除工作,但我不知道哪些内容可能已丢失或更改。我记得做的最后一件事是从表中删除所有行,但我认为这与该问题无关。

知道可能出现什么问题吗?

这个确实奏效了:

Query q = em.createNativeQuery("DELETE FROM Table t WHERE row = ?");

但我仍然不知道为什么另一个没有,正如我所说,选择确实可以正常工作。

这是堆栈跟踪:

java.lang.NullPointerException
at org.hibernate.impl.SessionFactoryImpl.getReturnTypes(SessionFactoryImpl.java:812)
at org.hibernate.impl.AbstractQueryImpl.getReturnTypes(AbstractQueryImpl.java:193)
at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:278)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:240)
at $Proxy87.createQuery(Unknown Source)
at com.xyz.persistence.dao.myDAO.deleteStuff(myDao.java:652) 

2 个答案:

答案 0 :(得分:4)

因为你的DELETE查询不会返回'type',所以查询不会接受resultClass参数,Table.class

它是一个怪异的api

答案 1 :(得分:0)

检查您的域对象Table。 Hibernate无法恢复该对象的元数据,因此可能存在问题。如果您正在使用JPA,请检查您的persistence.xml文件,并确保包含您的域对象。