2011-08-12 21 views
1

我有,我想在ResultSet使用的每一行的情況下,類MyRecord:如何在Anorm和Play Framework中使用可爲空的列?

case class MyRecord(id: Int, remindeMe: Option[org.joda.time.DateTime]) 

如何選擇所有表中的行,並返回使用Scala和ANORM有Play框架MyRecord的列表?

我曾嘗試用:

def getRecords() : List[MyRecord] = { 
     val records = SQL("SELECT id, data FROM mytable")().collect { 
      case Row(id: Int, Some(data: Long)) => 
         MyRecord(id, new org.joda.time.DateTime(data)) 
    } 
} 

如果列data是空我想None否則我想Some(data)作爲remindMe的情況下類。是的,上面的Scala代碼是非常錯誤的,但我不明白如何解決這個問題。

回答

0

因爲你已經定義的選項這應該工作:

def getRecords() : List[MyRecord] = { 
     SQL("SELECT id, data FROM mytable")().collect { 
      case Row(id: Int, Some(data: Long)) => 
        MyRecord(id, Some(new org.joda.time.DateTime(data))) 
      case Row(id: Int, None) => 
        MyRecord(id, None) 

    } 
} 

所粘貼會忽略所有的無結果,因爲它們將不匹配的一些(數據)

編輯情況:添加正如@ kassens所說,「toList」最終解決了這個問題。我在Play 1.2.2-Scala 0.91 env中測試了它。有一種方法可以向他提供點數? :)

+0

謝謝,但我怎麼得到它的名單?現在我得到這個錯誤:'提出的錯誤是:類型不匹配;發現:scala.collection.immutable.Stream [models.MyRecord]需要:List [models.MyRecord]' – Jonas

+0

@Jonas collect應該返回列表,我已經更新了代碼,val不應該在那裏。在Scala環境下做了一個快速測試(雖然沒有玩Anorm),但它的工作原理 –

+0

是的,我在運行代碼之前也刪除了'val records'。它是當前的代碼,返回'scala.collection.immutable.Stream [models.MyRecord]'而不是'List [models.MyRecord]' – Jonas

相關問題