Arrays 在hql内的数组上循环?

Arrays 在hql内的数组上循环?,arrays,grails,groovy,Arrays,Grails,Groovy,我有一个ID数组,我想在更新查询中循环它。我试过几种方法,但也有一些错误 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}"

我有一个ID数组,我想在更新查询中循环它。我试过几种方法,但也有一些错误

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])
hql=“”更新项目
SET nOrder=案例id
"""
//l1是ID的列表。
对于(int i=0;i您正在从(用户提供的?)字符串构建SQL,这是一个可怕的想法。错误归结为:
当2,1时,然后0
,这是无效的SQL(注意
),您很可能在
${l1[i]}中有一些浮点存储为字符串
或使用区域设置运行,其中数字用
等分隔。您应该在所有其他位置(编号
${l1[i]}
$i
)也使用参数替换(就像您对
:id
所做的那样)。例如:


iis有更好的方法来统计记录吗?这里的
我正在尝试循环一个存储在l1中的id数组。同时我正在更新多个记录的列表,并在where子句中传递id列表。请告诉我为什么id,顺序?此代码只是一个示例。如果您想要
案例…那么
行为,您很可能需要构建一个映射。这里的键不是在SQL语句中使用${}文本替换。
  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])
}
l1.eachWithIndex{ id, order ->
    Items.executeQuery("UPDATE Items SET nOrder=:order WHERE id=:id",[id:id, order:order])
}