2011-09-28 148 views
2

任何一個告訴我的HQL這個SQL代碼休眠更新查詢

UPDATE ModelClassname SET ClassVariablename = ClassVariablename + 10 WHERE ClassVariableId = 001;

回答

1

HQL查詢應該看起來很相似,只是不使用表和列名,你應該使用實體和屬性名稱(即無論你在Java中使用)。

1

除了亞當Batkin的答案,我想補充一點,這樣的查詢通常不使用(除非你需要一次修改行的整個高高飛翔)在Hibernate中。 Hibernate的目標是使用對象。所以你一般做:

MyEntity m = (MyEntity) session.get(MyEntity.class, "001"); 
m.setValue(m.getValue() + 10); 
// and the new value will automatically be written to database at flush time 
+0

謝謝您提及關於列名/實體變量名的樣品code.would? –

+0

我真的不需要在這裏提出一個論點,但我想弄清楚一件事(如果你覺得這是一個爭論,那麼不需要回答)。當更新完成1時,你會怎麼看?正常的sql查詢?或2.正常的hql查詢?考慮1.性能和效率以及2.更新行的數量?非常感謝您 –

+1

你只需要一行在你的例子進行更新,並且它是由它的主鍵訪問。採用專用的HQL或SQL查詢來做到這一點僅僅是對抗休眠,不會獲得你除了額外的複雜事情。您將失去批量更新和樂觀併發。不要反對休眠。只有在需要時才進行優化,當你測量它時很有用。 –

4

有使用HQL要做到這一點,你可以使用SQL直接,如果你想要做的是,通過JDBC查詢(甚至可以通過一個Hibernate查詢是沒有意義的,你可以使用SQL查詢)。

使用HQL查詢更新做批量更新,而不是一個單行時才建議。 http://docs.jboss.org/hibernate/core/3.3/reference/en/html/batch.html#batch-direct

一個更加面向對象的方法是使用HQL來加載你的對象,你需要在Java世界中做什麼(columnValue + = 10,你需要做其他),然後堅持回使用hibernate會話刷新。我認爲它涉及更多的操作,所以效率較低(純粹的性能),但取決於你的Hibernate配置(緩存,集羣,二級緩存等),它可能會好很多。當然,更不用說更多的可測試了。

+0

非常感謝您的解釋。如果我們使用普通的HQL查詢,而不是針對一個或幾個行更新的Objective類型,你會怎麼想呢?它也會效率不高嗎?您認爲在進程@後端使用HQL和HQL目標類型查詢是否相同? –

2

至於別人說,有更好的方法,但是如果你真的要,然後例如用語法如下:

update EntityName m set m.salary = m.salary +10 where m.id = 1 
+0

我們如何更新比對象的一個​​屬性嗎? – kommradHomer

+0

就像設置更多的值一樣:update EntityName m set attrA = 1,attrB = 2,attrC = 3其中m.id = 1 –

1

請試試這個

Query q = session.createQuery("from ModelClassname where ClassVariableId= :ClassVariableId"); 
q.setParameter("ClassVariableId", 001); 

ModelClassname result = (ModelClassname)q.list().get(0); 
Integer i = result.getClassVariableName(); 
result.setClassVariableName(i+10); 
session.update(result); 

與問候, Lavanyavathi .Bharathidhasan