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

时间:2015-01-12 13:23:34

标签: sql scala playframework playframework-2.0 anorm

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

def get_courses = {

    DB.withConnection { implicit connection =>

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

    }

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

val AllCourses = CourseModel.get_courses

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

当我尝试转换列表中的流[Row]时(来自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示例)

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

1 个答案:

答案 0 :(得分:2)

我怀疑您的问题的答案是,当您只是定义sql语句时,实际的数据库连接不会被使用。如果将鼠标悬停在SQL调用上,您将看到它不需要数据库连接。但是,result()或SQL(“...”)()确实需要连接,这是对数据库的实际调用。

我可以谦卑地建议您只编写控制器来操作类对象,而不是与anorm /数据库级工件交互。例如,您的模型层将有一个方法get_courses : List[Course](或者可能只是all,因为您可能会将其作为Course伴随对象的方法引用,即Course.all(),因此使用课程在方法名称中可能没有必要)返回Course对象。您的控制器会根据需要调用它,而不必担心Course对象是来自数据库,来自json文件,还是来自任何地方。

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