如何使用SQL在Groovy中查询地图?

时间:2019-07-18 20:06:40

标签: sql groovy

我正在尝试使用mysql使用Groovy查询地图:

def dat = [["id": person[-1], "date" : appt]]          
dat.each{ db -> 
           sql.eachRow(
            "select * from ${Sql.expand(db)};", 
             { println "\t$db ${it.mid}"} );

但是我得到一个错误:

java.sql.SQLSyntaxErrorException: 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 '=10886, date=19-01-2017}' at line 1

这里似乎是什么问题?


*************************************************** ** 编辑 ******************************************** *************

我现在正在尝试将地图插入到mysql中,然后使用以下查询进行查询:

  sql.execute '''DROP TABLE IF EXISTS EDSS'''

  sql.execute '''
  CREATE TABLE EDSS (
    id          INT,
    Clinic   VARCHAR(15),
    EDSS    VARCHAR(64),
    item     VARCHAR(64)
  );
  '''


  sql.withBatch("INSERT INTO EDSS (id, Clinic, EDSS, item) VALUES (?,?,?,?)"){ bt ->
      bt.addBatch(df)
  } 
  def res = sql.eachRow("select * from EDSS"){ row ->
      println "$row"
  } 

sql.eachRow部分工作正常,即可以选择,但是在插入语句中,我似乎只是在地图中插入第一行,即

println(df):

[1025386, 20-10-2017, null, ahddkw9d9c]
[10213446, 19-04-2017, 2.5, null]
[102382, 19-04-2017, null, null]
[1628466, 19-04-2017, null, 292jdmd02d]
[1111345, 18-09-2015, unchanged, null]

但是:

println(res):

[1025386, 20-10-2017, null, ahddkw9d9c]

*********************************** 另一个编辑 *** ******************************************************

因此,尝试使用以下方法循环遍历地图df中的所有值:

sql.withBatch { stmt ->
            df.each { k, v, x, y ->
                stmt.addBatch("INSERT INTO EDSS (study_id, Clinic, EDSS, NHS) VALUES ('$k', '$v', '$x', '$y')")
            }
      }

导致:

groovy.lang.MissingMethodException: No signature of method: sql$_run_closure1$_closure2$_closure4.doCall() is applicable for argument types: (java.lang.String) values: [1025386]

我习惯了R,这里一切都很好并且被矢量化了。如果有人能提供全部帮助,那将是很棒的事情!

1 个答案:

答案 0 :(得分:1)

我在这里看到的内容:

您正在尝试插入 java.util.ArrayList [[val11, val12,...],[val21, val22,...]]。您几乎快要完成尝试了。

注意:在评论小工具中已经提到了该答案。我只是想显示代码。

答案:

def df = [
[1025386, '20-10-2017', null, 'ahddkw9d9c'],
[10213446, '19-04-2017', 2.5, null],
[102382, '19-04-2017', null, null],
[1628466,'19-04-2017', null, '292jdmd02d'],
[1111345, '18-09-2015', 'unchanged', null]
]
sql.withBatch("INSERT INTO EDSS (id, Clinic, EDSS, item) VALUES (?,?,?,?)"){ bt ->                      
    df.each { row ->
            bt.addBatch (row) // <==== Answer Line
    }
} 
sql.eachRow("select * from EDSS"){ row ->
        println "$row"
}

说明:

变量bt实际上是BatchingPreparedStatementWrapper对象。参见groovy document

因此addBatch()方法可以接受这些类型List<Object>Object[]

输出:

[id:1025386, Clinic:20-10-2017, EDSS:[null], item:ahddkw9d9c]
[id:10213446, Clinic:19-04-2017, EDSS:2.5, item:[null]]
[id:102382, Clinic:19-04-2017, EDSS:[null], item:[null]]
[id:1628466, Clinic:19-04-2017, EDSS:[null], item:292jdmd02d]
[id:1111345, Clinic:18-09-2015, EDSS:unchanged, item:[null]]