如何解决 "Connection => [A]" 与 Play-JDBC 的类型不匹配问题?

How to resolve type mismatch for "Connection => [A]" with Play-JDBC?

我正在构建一个相对简单的 REST API,我最终决定在 Play 框架内将 Anorm 用于我的数据库访问库。但是,我在使用基本列表查询时遇到了一些麻烦。我确信这是一个简单的修复,但我无法找到该问题的任何文档/解决方案。在其他示例中,代码或多或少地做了与最后调用/返回的 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
    }
}

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

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

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

Anorm查询可以简化为:

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