2013-01-15 55 views
0

我遇到了很奇怪的問題,無法找到解決的辦法。我寫了下面的HQL中的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

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(); 
+0

@Antropo確定。但我沒有獨特的結果。除此之外的所有記錄都不是主要記錄。我不相信如果我想改變一個屬性的所有記錄。我應該得到記錄,更改每個循環中的屬性並保存 – Ray

+0

使用list()更改'uniqueResult()'並更新循環中的所有對象。 – Atropo

+0

@Antropo我明白,如果我有列表,我改變循環OK中的屬性,但這意味着,而不是分配這個任務上的數據庫我手動和循環。在db中簡單查詢需要更多時間。如果我有10000條記錄... – Ray