我面临着非常奇怪的问题,并且无法找到解决问题的方法。我在intellij的HQL控制台中编写了以下HQL
update NewsEntity ne set ne.main=false where ne.main=true
栈跟踪
java.lang.IllegalArgumentException: node to traverse cannot be null!
at org.hibernate.hql.ast.util.NodeTraverser.traverseDepthFirst(NodeTraverser.java:31)
at org.hibernate.hql.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:254)
at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:157)
at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:111)
at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:77)
at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:56)
at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:72)
at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:133)
at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:112)
at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1623)
in RemoteSessionImpl.createQuery(RemoteSessionImpl.java:50)
in RemoteUtil.executeWithClassLoader(RemoteUtil.java:122)
in RemoteUtil$2$1.invoke(RemoteUtil.java:81)
in HibernateEngine.createQuery(HibernateEngine.java:142)
当我写一个delete
查询时,我没有遇到同样的问题。
我的观点基于以下文章HQL update query。但是,似乎无法弄清楚为什么我仍然遇到这个问题。
答案 0 :(得分:0)
像Hibernate
这样的ORM的想法是避免这种更新查询。
您只需从数据库加载对象,更改字段,然后Hibernate
将更新对象以进行输出。
Query query = session.createQuery("from NewsEntity ne where ne.main = true");
NewsEntity newsEntity = (NewsEntity) query.uniqueResult();
newsEntity.setMain=false;
//Hibernate will update the object
如果有更多对象:
List<NewsEntity> newsEntities = (List<NewsEntity>) query.list();
for(NewsEntity entity : newsEntities)
{
entity.setMain=false;
}
Hibernate也支持DML语句,所以你应该做update
查询:
Query query = session.createQuery("your update query");
int result = query.executeUpdate();