【问题标题】:Passing a list to SQL each row call Groovy将列表传递给 SQL 每一行调用 Groovy
【发布时间】:2014-10-21 14:31:52
【问题描述】:

我目前正在使用以下方法从数据库中呈现 sql 行列表:

Sql sql = new Sql(dataSource)
def list = []
def index = 0
params.mrnaIds.each { mrnaName ->
   sql.eachRow ("select value from patient_mrna where mrna_id=$mrnaId") { row ->
      list[index] = row.value
      index++
   }
}
render list

但是我想避免在渲染它们之前将值分配给列表。

变量params.mrnaIds 来自多选输入,因此它可以是单个字符串或包含ID 的字符串数组。有没有办法在 eachRow 方法中遍历这些 id?

我希望能够执行以下操作:

render sql.eachRow ("select value from patient_mrna where mrna_id=?", params.mrnaIds) { row ->
   list[index] = row.value
   index++
}

但我不完全确定是否有一种方法可以使用此功能调用 eachRow。如果没有,是否有其他方法可以在不将结果存储在列表中的情况下呈现结果?

【问题讨论】:

    标签: sql grails groovy


    【解决方案1】:

    我觉得你可以render每一行:

    sql.eachRow( someQuery, someParams ){ row ->
      render row as JSON
    }
    

    【讨论】:

    • 效果很好!虽然因为我试图打印出浮点值,但除非我将它们传递给地图,否则我无法将它们调用为 JSON。
    【解决方案2】:

    rows() 可以返回一个列表,而不是可以使用它(如eachRow() 用于)。它还共享所有不同的论点。例如:

    render sql.rows("select value from patient_mrna where mrna_id=?", params).collect{ it.value }
    

    【讨论】:

    • 这会返回一个不可序列化的异常
    • @janDro 你在用collect吗?
    • 第一个,虽然我认为两者都适用
    • @janDro 我已经改变了答案,因为第一个只是一个例子。您不能在那里序列化 Growresult-thingy 并且必须使用收集。
    • @janDro 那么在你的 SQL 中使用in。除了收集之外,您还可以使用collectEntries 来构建地图,这很可能是可序列化的。然而,这与最初的问题不同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-17
    • 2014-01-06
    • 2019-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多