2014-10-01 245 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