2010-03-16 48 views
1

我有一張地圖,我想堅持下去。域對象是這樣的:HQL多次更新。有沒有更好的辦法?

public class Settings { 
    private String key; 
    private String value; 

    public String getKey() { ... } 
    public String getValue() { ... } 
    public void setKey(String key) { ... } 
    public void setValue(String value) { ... } 
} 

的標準方法是,以產生Setting對於每一對,和saveOrUpdate()它。但是它會產生太多的查詢,因爲我需要一次節省大量設置,並且它確實會影響性能。有沒有辦法使用一個更新查詢來做到這一點?

UPD:好的,也許有更新多行的hql語法?像

update Settings s1 set s1.value = :value1 where s1.key = :key1 
       s2 set s2.value = :value2 where s2.key = :key2 
+0

我知道它的方式舊帖子。但是你對這種查詢使用了什麼?我需要使用JPA/Hibernate運行完全相同的查詢 – 2013-07-11 21:36:41

回答

1

東西,如果每個設置在一個表中的一行,然後需要有發行儘可能多的更新語句。但有幾件事要看

1)調整休眠批量大小說20左右,這意味着雖然休眠發出20次更新,他們都作爲一批發送(希望一個網絡往返旅行,提供驅動程序允許批量)

2)修改您的DAO代碼/事務邏輯做事一批

3)有一個存儲過程,傳遞數組值(休眠和storedprocs不是很好的朋友,我認爲)

0

我不知道任何允許擁有多個where語句的語法,比如你所擁有的語句tten。

確保您使用的配料。如果不嘗試使用激活的更新。

如果您想使用更新設置表中的值已經在數據庫中的其他地方,你應該能夠做一個更新。這可能會更快。

如果數據尚未在數據庫中,可以在臨時表做一個更新查詢之前將其插入,但在這裏,你將需要SQL查詢(這是可能的休眠)。

但是,一個更新語句可能仍然太慢。最後的解決方案(沒有完全重新思考用例的邏輯)我知道是一個'select for update'語句。這是原始的jdbc,但是彈簧JdbcTemplate,這並不是那麼痛苦。您可以選擇您想要更新的所有行(如果它發出請求更快,你可能會選擇更多,但在這種情況下,你會對網絡資源的影響,越來越多排出來比所需的分貝),然後更新他們在使用jdbc時會抓取它們。

相關問題