使用Anorm从RDBMS中选择,为Scala选择Play 2.2

时间:2013-10-12 12:27:29

标签: scala playframework-2.0 anorm

我已经放下这段代码,以便使用Anorm从表中检索一行,但是我收到了一个错误。这是代码:

case class UserInquiry(
    id:Long, description:String
)

object UserInquiry {
   val byIdStmt = """
      SELECT id, description FROM user_inquiry WHERE id = {id}
   """

   def findById(id: Long) = {
      DB.withConnection { implicit conn =>
         SQL(byIdStmt).on("id" -> id).apply().collect {  
            case Row(Some(id:Integer), Some(description:String)) => 
            new UserInquiry(id.toLong, description)
         }.head
      }    
   }
}

// This gives me an error
val id = UserInquiry.findById(7) 

这是错误:

[MatchError: Row('ColumnName(user_inquiry.id,Some(id))':4 as java.lang.Integer,
'ColumnName(user_inquiry.description,Some(description))':My search as java.lang.String)
(of class anorm.SqlRow)]

如果我从SQL语句中删除'id'列并从代码中删除它的引用以便只获取名为'description'的列,那么一切正常。

'id'栏中有什么问题?如果它是java.lang.Integer列,为什么没有匹配?是否可能有一个特定于DB'主键'的类?

1 个答案:

答案 0 :(得分:0)

好的,我弄错了:

作为'id'列的PK,以下代码行

case Row(Some(id:Integer), Some(description:String)) 

必须改为:

case Row(id:Integer, Some(description:String)) 

那是因为PK列不能为NULL,因此不希望使用Option [T]对象来封装从DB中检索的值。