这一行抛出根在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();
出于某种原因,该表上的选择工作正常,我记得在同一个表上也看到了一个delete,但我不知道哪里可能丢失或更改了某些内容。我记得做的最后一件事是从表中删除所有行,但我认为这与问题无关。
知道怎么回事吗?
这个确实有效:
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)
最佳答案
因为delete查询不会返回“type”,所以查询不会接受resultClass参数table.class
这是一个古怪的API