One way to solve this problem would be the following:
def pessoaIds = [1, 2, 3, 4, 5]
def inSql = ""
//Monta uma variável String que será os itens da lista
//pessoaIds separadas por vírgual
pessoasIds.each {inSql = inSql + it + ","}
//Retira a vírgula que sobra no processo de criar a variável acima
inSql = inSql.substring(0,inSql.lenght()-1)
//Monta a consulta, incluindo a variável acima
def query = """
"SELECT * FROM Pessoa WHERE id IN(${inSql})"
"""
//Como estamos fazendo query.toString(), a String será avaliada
//antes de ser passada como parametro para o método eachRow
//Parte da avaliação é interpretar a variável inSql colocando o seu
//conteúdo na String, ou seja, o valor passado para o eachRow é
//um SQL já montado e sem parametro
sql.rows(query.toString()) { row ->
}
Note that I am not using parameters (? or :parameter) in SQL and this hurts the good principles of passing parameter to SQL.
If this bothers much, another way to resolve it would be this (see: http://groovy.329449.n5.nabble.com/In-operator-in-Groovy-SQL-td4768856.html):
def pessoaIds = [1, 2, 3, 4, 5]
def placeholders = []
//Monta um vetor de placeholders ? (para ser usado como parametro na query)
pessoaIds.each { placeholders << '?' }
//Monta a consulta, transformando o placeholders em uma string
//separada por virgula
def query = """
"SELECT * FROM Pessoa WHERE id IN(${placeholders.join(',')})"
"""
//Para esse caso, estamos efetivamente passando um parametro para
//a query
sql.rows(query, pessoaIds).each { println it }
I don’t remember much from jdbc, but use:
def query = "SELECT * FROM Pessoa WHERE id IN :pessoaIds"
– fsi
I’ve tried using a key like the example you indicated and it still didn’t work.
– Alisson Diniz
if Voce uses grails, why not
Pessoa.findAllById(pessoaIds)
? orPessoa.getAll(pessoasIds)
?– fsi