2014-10-01 246 views
0

我有一個數組,我想循環內更新查詢。我嘗試了幾種方法,但有一些錯誤。在hql中循環數組?

hql = """UPDATE items 
       SET nOrder = CASE id 
       """ 
     //l1 is the list of ids. 
     for(int i = 0; i <= l1.size(); i++) { 
      hql += "\n WHEN ${l1[i]} THEN ${i}" 
     } 
     hql += "\n END" 
     hql += "\n WHERE id IN (:id)" 
     Items.executeUpdate(hql,[id: l1]) 

即使我已經嘗試過這樣得到了同樣的錯誤。

for(int i = 0; i <= l1.size(); i++) { 
      Items.executeQuery("UPDATE Items SET nOrder = CASE id WHEN ${l1[i]} THEN ${i} END WHERE id IN (:id)",[id: l1]) 
} 

錯誤消息。

期待 「然後」,找到 '' 近線1,列61 [UPDATE SET org.items = nOrder CASE WHEN ID 2,1 THEN 0 END WHERE ID IN(:ID)]

任何人都可以讓我知道我在做什麼錯嗎?

+0

'我<= l1.size()'看起來很奇怪 – cfrick 2014-10-01 10:25:31

+0

有沒有更好的方法來計算的記錄? – 2014-10-01 13:07:00

+1

'<='是這裏的奇怪部分。通常'size()'返回大小,所以從0開始的for循環需要'i cfrick 2014-10-01 13:11:06

回答

0

您正在從(用戶提供的?)字符串構建SQL,這是一個可怕的想法。那裏的錯誤歸結爲:WHEN 2,1 THEN 0,這是無效的SQL(注意那裏的,)。你是最有可能有一些浮動存儲爲字符串${l1[i]}或所有其他地方也有一個區域,其中數字與,分開,等你應該用參數替換(如你已經爲:id做)運行(不${l1[i]}$i)。例如: -

l1.eachWithIndex{ id, order -> 
    Items.executeQuery("UPDATE Items SET nOrder=:order WHERE id=:id",[id:id, order:order]) 
} 
+0

heree我試圖循環存儲在l1中的一個ID數組。而且我正在更新多個記錄的列表,並且我在where子句中傳遞了id列表。你能告訴我爲什麼id,命令? – 2014-10-01 13:35:45

+0

我已經看到,順序表示0 – 2014-10-01 14:08:02

+0

該代碼是一個簡單的例子。如果你想在'案... then'行爲,你將極有可能建立一個映射。這裏的關鍵是沒有使用SQL語句中的$ {}文本替換。 – cfrick 2014-10-01 14:57:27