7 Sep 04:14
[groovy-user] Groovy SQL problem with "in" parameters
From: adrianp <adrian.a.powell@...>
Subject: [groovy-user] Groovy SQL problem with "in" parameters
Newsgroups: gmane.comp.lang.groovy.user
Date: 2008-09-07 02:16:34 GMT
Subject: [groovy-user] Groovy SQL problem with "in" parameters
Newsgroups: gmane.comp.lang.groovy.user
Date: 2008-09-07 02:16:34 GMT
I've been struggling with this problem and have tried a lot of different
things but I just can't seem to get it to work. I can't find anyone asking
the problem on the intrawebs so I'm hoping I'm doing something so boneheaded
that I'm the first person to be confused by it.
I want to query a temporary MySQL table to get back some rows whose value is
in a given array. I can get this working using GORM's Criteria Builder
using standard tables but I don't have any mappings defined for temp tables
so I'm doing this manually, using groovy.sql.Sql.
The query I want to run is: "select t.id, t.val1 from test1 t where t.val1
in ?" where the last argument is an array of Strings. Running it just as
"... in (?)" gives me zero rows no matter what arguments I pass. If I run
"... in ?" then I get:
Error with SQL: com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: You
have an error in your SQL syntax; check the manual that corresponds to your
MySQL server version for the right syntax to use near
'_binary'¬í\0ur\0[Ljava.lang.String;ÒVçé
{G\0\0xp\0\0\0t\0oranget\0carrot'' at line 1
It looks like its doing something very strange with my parameters. I would
convert them into a comma-delimited string and insert them directly into the
SQL but they're all user-entered parameters and I would rather not deal with
the security problems that raises.
I'd be grateful for any insight anyone has. It's really got me foozled.
Here is a test application:
----------
import groovy.sql.Sql
class SqlTests {
static void main(args) {
try {
def db =
Sql.newInstance("jdbc:mysql://localhost/test?enable-named-pipe&socketFactory=com.mysql.jdbc.NamedPipeSocketFactory",
"user", "password", "com.mysql.jdbc.Driver")
db.execute("""
create temporary table test1 (
id bigint(20) unique auto_increment,
val1 varchar(15)
)""")
def insertStmt = "insert into test1(val1) values (?)"
def values = ["apple", "orange", "carrot", "lettuce", "beet", "turnip"]
values.each{ db.executeInsert(insertStmt, [it]) }
// validate
db.eachRow("Select id, val1 from test1", {println "inserted ${it.id} -
${it.val1}"})
String[] params = ["orange", "carrot"].toArray()
def queryStmt = "select t.id, t.val1 from test1 t where t.val1 in (?)"
def rowsReturned = 0
def res = db.eachRow(queryStmt, [params], {
println "Result: ${it}"
rowsReturned++
})
println "Querying for ${params}, Rows returned: ${rowsReturned},
expecting 2"
} catch( Exception e ) {
println "Error with SQL: ${e}"
e.printStackTrace()
}
}
}
-----------
Here's the sample output:
inserted 1 - apple
inserted 2 - orange
inserted 3 - carrot
inserted 4 - lettuce
inserted 5 - beet
inserted 6 - turnip
Querying for {"orange", "carrot"}, Rows returned: 0, expecting 2
--
--
View this message in context: http://www.nabble.com/Groovy-SQL-problem-with-%22in%22-parameters-tp19353622p19353622.html
Sent from the groovy - user mailing list archive at Nabble.com.
---------------------------------------------------------------------
To unsubscribe from this list, please visit:
http://xircles.codehaus.org/manage_email
RSS Feed