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

标签 sql scala playframework playframework-2.0 anorm

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

def get_courses = {

    DB.withConnection { implicit connection =>

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

    }

当我从 Controller 调用它时,我正在这样做(我想获得一个列表):

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 示例)

但我想让它们在 Controller 中分开......

最佳答案

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

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

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

关于sql - 找不到参数连接的隐式值 : java. sql.Connection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27903002/

相关文章:

java - IntelliJ 和 Play 框架 : "` scala-library` has broken sources path"

mysql - mysql 选择查询中的别名

sql - sql中变量的数据类型大小

scala - Shapeless 是否使用反射,在 Scala 生产代码中使用是否安全?

java - 如何统计akka系统中特定时间活跃的特定类型的actor?

playframework - playframework2 中的 H2 数据库失败

java - Scala中如何在特定时间安排任务?

MYSQL:在 SELECT 中对自己定义的参数执行 where

mysql - 获取2016年提交请求的所有新用户

arrays - 如何使用Scala和Spark从数组中选择非顺序子集元素?