我从 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/