2011-07-26 55 views
9

當我嘗試執行以下HQL查詢:問題HQL更新

Query query = getSession().createQuery("update XYZ set status = 10"); 
query.executeUpdate(); 

我得到這個異常:

Exception in thread "main" org.hibernate.QueryException: query must begin with SELECT or FROM: update 

編輯:
我也試過以下。但它doennot擦出火花。

org.hibernate.Query query = getSession().createQuery("update XYZ t set t.status = 10"); 

EDIT2: 在hinbernate.cfg.xml進行更改解決我的問題 早些時候,我使用

setting hibernate.query.factory_class" = org.hibernate.hql.classic.ClassicQueryTranslatorFactor 

現在使用下列財產

<property name="hibernate.query.factory_class">org.hibernate.hql.ast.ASTQueryTranslatorFactory</property> 
+0

什麼版本冬眠? –

+1

看看https://forum.hibernate.org/viewtopic.php?t=944696&highlight=query+begin+select+delete – kalyan

+0

@Ray toal:版本3.2.5 – akshay

回答

5

那不是一個HQL查詢。 你想輸入javax.persistence.Query,它允許正常 sql, 不是org.hibernate.Query它的工作entity objects

如果你想使用簡單的SQL,您還可以使用PreparedStatement

但是,如果你真的想使用Hibernate,而不採取entityobjects的優勢(完全擊敗擺在首位,恕我直言,使用Hibernate的點),你可以做這樣的(reference docs):

String myUpdate = "update XYZ myAlias set myAlias.status = :newStatus"; 
// or String noAliasMyUpdate = "update XYZ set status = :newStatus"; 
int updatedEntities = getSession().createQuery(myUpdate) //or noAliasMyUpdate 
     .setInt("newStatus", 10) 
     .executeUpdate(); 
+0

好的。我也會爲這一個去createSQLQuery。 –

+0

+1,儘管我不同意你關於使用Hibernate的觀點。在我看來,有時你必須做一些批量操作。將Named查詢放在適當的文件中將防止Hibernate在Object發生更改時啓動。所以你會修復它。在執行它們之前,不要忘記批量更新。 – ssedano

+0

@Udo Fholl確實,但這只是一個簡單的更新 - 而不是批量操作。我覺得NamedQueries超出了這個問題的範圍。 – NimChimpsky

0

嘗試:

Query query = getSession().createQuery("update XYZ o set o.status = 10"); 
query.executeUpdate(); 

看看this也。

+0

確實有效,我以爲你必須提供指定參數,然後設置? – NimChimpsky

+0

如果有命名參數,則必須添加該參數。 – ssedano

+0

@all:我嘗試了你的方法,就像我最近編輯中提到的那樣,但它不工作 – akshay

0
Session sesssion = getSession(); //getter for session 

對於HQL:

String hql = "update Activity " + 
"set startedOn = :taskStartedOn " + 
"where id = :taskId"; 

Query query = session.createQuery(hql); 
query.setDate("taskStartedOn",new Date()); 
query.setLong("taskId",1) 
int rowCount = query.executeUpdate(); 

這裏活動是POJO。

+0

這裏沒有提到Activity作爲pojo;我覺得這很混亂。你必須提供命名參數,然後設置使用休眠? – NimChimpsky

+0

活動是我的POJO的名稱,是的,它也命名參數「taskstartedOn」和「taskId」。 「startedOn」和「id」是POJO的屬性。 –

+0

pojo不在你的代碼片段的任何地方使用,第二個sql語句不使用命名參數。 – NimChimpsky

3

問題思考的是SQL的時候,你應該在對象思考:

XYZ xyz = new XYZ(); 
xyz.setStatus(10); 
getSession().merge(xyz); 
0

使用

hibernate.query.factory_class = org.hibernate.hql.ast.ASTQueryTranslatorFactory 

hibernate.cfg.xml文件來解析例外:

org.hibernate.QueryException: query must begin with SELECT or FROM: update.....