2015-07-21 27 views
1

你好,我正在嘗試使用Groovy Sql連接來獲取行,但它將列表中的記錄作爲列表返回。以下: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]]

任何一個可以幫助我弄清楚爲什麼結果是一個列表內列表。我如何使用方法將其作爲單級列表獲取?

回答

1

它不返回List一個List裏面,它會返回一個MapList每個包含從您選擇選定的列映射。

所以,如果你想所有的選擇(如列表)的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是每個字段的第一行的值

2

您的結果將作爲地圖列表返回,而不是列表列表。看看內部的':'和','字符。你可以使用標準的groovy從這些值中提取值。

就你而言,它看起來像你正在使用主鍵搜索,所以只會返回一個結果,因此在這種情況下使用firstRow,這樣就不必從列表中提取單個映射結果。

有關示例,請參閱groovy Sql class的文檔。

在您返回多行更一般的情況,那麼你的數據大概是這樣的:

[[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 functions

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

的,我認爲你的主要問題是沒有認識到一個列表中的單個映射條目。