Details
-
Type:
Bug
-
Status:
Closed
-
Priority:
Critical
-
Resolution: Fixed
-
Affects Version/s: 2.0-beta-3
-
Fix Version/s: 2.0-beta-3, 1.8.7
-
Component/s: None
-
Labels:None
-
Number of attachments :
Description
All the examples of using findAll in the Sql DataSet class use literals for the search values of queries. Using free variables causes failure as Groovy does not implement lexical closure automatically. However this can be realized using the Closure delegate field. I therefore believe that the following example fails because the Sql.SqlWhereVisitor fails to lookup variables but assumes that all query values are literals.
import groovy.sql.DataSet import groovy.sql.Sql @Grapes ( [ @Grab ( 'org.xerial:sqlite-jdbc:3.7.2' ), @GrabConfig ( systemClassLoader = true ) ] ) def database final words = [ ] try { database = Sql.newInstance ( 'jdbc:sqlite:database.db' , 'org.sqlite.JDBC') final wordsTable = new DataSet ( database , 'words' ) ( 0 ..< 4 ).each { i -> final query = { item -> item.id == i } query.delegate = { i : i } query.resolveStrategy = Closure.DELEGATE_FIRST words << wordsTable.findAll ( query ).firstRow ( ).word } } finally { database?.close ( ) } println words.join ( '' )
Issue Links
- relates to
-
GROOVY-5373
Sql DataSet fails to work with non-literals in queries (enhancement required)
-
Just a small aside: You don't need the @Grapes annotation in your example above - just the @Grab and @GrabConfig should suffice.