1

您好,我正在尝试使用 Groovy Sql 连接获取行,但它会将记录作为列表中的列表返回给我。以下:

Sql sql = new Sql(dataSource)
List<GroovyRowResult> row = sql.rows('select * from user where username=:userName and password=:password, [userName:'groovy',password:'123'])

将结果返回为[[return record as map]]

任何人都可以帮助我弄清楚为什么结果是List 内的 List。如何使用rows方法将其作为单级列表获取?

4

2 回答 2

3

您的结果以地图列表的形式返回,而不是列表列表。查看内部的 ':' 和 ',' 字符。您可以使用标准 groovy 从这些值中提取值。

在您的情况下,看起来您正在使用主键搜索,因此只会返回一个结果,因此firstRow在这种情况下使用,这样您就不必从列表中提取单个映射结果。

有关示例,请参阅groovy Sql 类的文档。

在返回多行的更一般情况下,您的数据可能如下所示:

[[username:"foo", password:"foopass"], [username:"bar", password:"barpass"]]

假设这条线:

def results = sql.rows('select * from user')

然后,您可以执行传播运算符之类的操作:

assert results.username == ["foo", "bar"]
assert results.password == ["foopass", "barpass"]

或迭代结果

results.each { println it.username }
==> foo
==> bar

或使用许多Collection 函数中的任何一个

println results.collect { "${it.username} -> ${it.password}" }
==> [ "foo -> foopass", "bar -> barpass" ]

我认为您的主要问题是无法识别列表中的单个地图条目。

于 2015-07-21T09:21:11.063 回答
2

它不返回 a Listinside a List,而是返回一个Listof Map,每个地图包含从您的选择中选择的列。

因此,如果您希望username选择所有 s(作为列表),您可以这样做:

def usernames = row.username

如果你只想要一行,你可以这样做:

GroovyRowResult row = sql.firstRow('select * from user where username=:userName and password=:password, [userName:'groovy',password:'123'])

然后这实际上只是一个映射,每个key都是选择的字段名称,每个value都是每个字段第一行的值

于 2015-07-21T08:09:35.393 回答