我开始使用Play 2.2.1和Scala 2.10.2开发。我正在开发一个CRUD应用程序。我跟随了书中的一个例子" Play for Scala:Covers 2",但我有一个问题。
在这本书中,模型中有这个代码
import play.api.Play.current
import play.api.db.DB
def getAll: List[Product] = DB.withConnection { implicit connection =>
sql().map
( row =>
Product(row[Long]("id"), row[Long]("ean"), row[String]("name"), row[String]("description"))
).toList
}
但是当我尝试运行它时,我收到了这个错误:
value map is not a member of anorm.SqlQuery
为什么不运行.map?
谢谢!
答案 0 :(得分:1)
SqlQuery
没有map
功能。我不确定这本书中的例子应该如何看,但如果它使用那种笨重的语法来表示我,我会有点担心。我认为应该始终优先使用与函数本身分开定义的结果集解析器 - 因为您将能够在其他地方重用它们。
import anorm._
import anorm.SqlParser._
import play.api.Play.current
import play.api.db.DB
case class Product(id: Long, ean: Long, name: String, description: String)
object Product {
/** Describes how to transform a result row to a `Product`. */
val parser: RowParser[Product] = {
get[Long]("products.id") ~
get[Long]("products.ean") ~
get[String]("products.name") ~
get[String]("products.description") map {
case id ~ ean ~ name ~ description => Product(id, ean, name, description)
}
def getAll: List[Product] = {
DB.withConnection { implicit connection =>
SQL("SELECT * FROM products").as(parser *)
}
}
}
我假设您的表名为products
。最好在解析器中使用完整列名称(products.id
而不是id
),就好像以后需要组合解析器(使用连接结果),然后anorm不会因使用多个表而混淆类似于id
的列名。 getAll
函数现在看起来更清晰,我们可以将解析器重用于其他函数:
def getById(id: Long): Option[Product] = {
DB.withConnection{ implicit connection =>
SQL("SELECT * FROM products WHERE id = {id}")
.on("id" -> id)
.as(parser.singleOpt)
}
}
答案 1 :(得分:0)
在教程中提到了
在我们获得任何结果之前,我们必须创建一个查询。有了Anorm,你打电话
anorm.SQL
将您的查询作为字符串参数:
import anorm.SQL
import anorm.SqlQuery
val sql: SqlQuery = SQL("select * from products order by name asc")
您的代码中是否遗漏了这些内容?
答案 2 :(得分:0)
SqlQuery正在变为私有(待定PR),所以不应该直接使用它。就地SQL(" ...")或SQL" ..."可以以更安全的方式使用函数。
最佳