如何使用Play-JDBC解决“连接=> [A]”的类型不匹配?

时间:2020-08-12 04:32:26

标签: scala playframework

我正在构建一个相对简单的REST API,最后我决定使用Anorm,将其用于Play框架中的数据库访问库。但是,我在使基本列表查询正常工作时遇到了一些麻烦。我确信这是一个简单的修复程序,但是我无法找到有关此问题的任何文档/解决方案。在其他示例中,代码或多或少地在执行query.as(parser *)函数最后一次调用/返回的相同操作。

问题是我的功能是(根据IntelliJ)查找Connection => Unit类型而不是所需的Connection => Seq[MyType]类型。这是我的代码:

case class MyType(id: Int, name: String, createdAt: LocalDateTime, updatedAt: LocalDateTime)
class MyTypeRepository @Inject()(
    dbApi: DBApi
)(implicit ec: DBExecutionContext) {
    private val db = dbApi.database("default")

    private val parser: RowParser[MyType] = {
        for {
            id <- int("mytpe.id")
            name <- str("mytype.name")
            createdAt <- get[LocalDateTime]("mytype.created_at")
            updatedAt <- get[LocalDateTime]("mytype.updated_at")
        } yield (MyType(id, name, createdAt, updatedAt))
    }

    def list(): Seq[MyType] = {
        db.withConnection { implicit conn =>
            val query = SQL("SELECT * FROM mytype")
            val result = query.as(parser *)
        } // Type mismatch error is showing up here
    }
}

1 个答案:

答案 0 :(得分:1)

将Anorm结果分配给val而不是返回,因此编译器适当地推断出返回了Unit

删除对val result的分配,因此将返回query.as(..)(而不是本地分配)。

def list(): Seq[MyType] = {
    db.withConnection { implicit conn =>
        val query = SQL("SELECT * FROM mytype")
        query.as(parser *)
    }
}

正常查询可以简化为:

def list(): Seq[MyType] = db.withConnection { implicit conn =>
  SQL"SELECT * FROM mytype".as(parser *)
}
相关问题