我从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示例)
但我想让它们在控制器中分开......
答案 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)
选项[课程]。