找不到参数连接的隐式值:java.sql.Connection

could not find implicit value for parameter connection: java.sql.Connection

我从 Scala 开始。我在模型中有我的方法:

def get_courses = {

    DB.withConnection { implicit connection =>

      val result = SQL("SELECT * FROM courses")
      result

    }

当我从控制器调用它时,我正在这样做(我想得到一个列表):

val AllCourses = CourseModel.get_courses

// Transform the resulting Stream[Row] as a List[(String)]
val CoursesList = AllCourses().map(row =>
  row[String]("name")
).toList

当我尝试转换列表中的流[行](来自https://www.playframework.com/documentation/2.0/ScalaAnorm)时出现错误

could not find implicit value for parameter connection: java.sql.Connection

与 AllCourses() 代码相关。

有什么想法吗?

然而这很奇怪,因为当我添加所有相同的方法时

def get_courses = DB.withConnection { implicit connection =>
   val result = SQL("SELECT * FROM courses")

   // Transform the resulting Stream[Row] as a List[(String)]
   val CoursesList = result().map(row =>
       row[String]("name")
   ).toList

} 

有效(如 https://www.playframework.com/documentation/2.0/ScalaAnorm 示例)

但我想在控制器中将它们分开...

我怀疑您的问题的答案是,当您简单地定义 sql 语句时,不会使用实际的数据库连接。如果将鼠标悬停在 SQL 调用上,您会看到它不需要数据库连接。然而,result() 或 SQL("...")() 确实需要一个连接,而这正是对数据库进行实际调用的地方。

我能否谦虚地建议您编写控制器仅在您的 class 对象上运行,而不是与 anorm/database-level 人工制品交互。因此,例如,您的模型层将有一个方法 get_courses : List[Course](或者可能只是 all,因为您可能会将其引用为 Course 伴随对象的方法,即 Course.all(),因此使用 course在方法名称中可能不是必需的)which returns Course 对象。您的控制器会根据需要调用它,而无需担心 Course 对象是来自数据库、json 文件还是来自任何地方。

我还发现解析器非常有用,因此定义一个解析器 courseP 例如,它创建课程对象,然后在您需要阅读一门或多门课程的任何地方使用 - 类似于 SQL("select ... from course").as(courseP *)用于课程列表,或 SQL("select ...").as(courseP.singleOpt) 用于选项[课程]。