我在Playframework 2中有这个ScalaQuery模型
object User {
implicit object UserFormat extends Format[User] {
def reads(json: JsValue) : User = User(
None,
(json \ "firstName").as[String],
(json \ "lastName").as[String],
(json \ "email").as[String]
)
def writes(user: User) : JsValue = JsObject(Seq(
"firstName" -> JsString(user.firstName),
"lastName" -> JsString(user.lastName),
"email" -> JsString(user.email))
)
}
}
object UsersTable extends Table[User]("users") {
def id = column[Long]("USER_ID", O.PrimaryKey, O.AutoInc)
def fName = column[String]("USER_FIRSTNAME", O.NotNull)
def lName= column[String]("USER_LASTNAME", O.NotNull)
def email = column[String]("USER_EMAIL", O.NotNull)
def user_email_idx = index("user_email_idx", email, unique = true)
def * = id.? ~ fName ~ lName ~ email <> (User.apply _, User.unapply _)
def forInsert = fName ~ lName ~ email <> ({ (f, l, e) => User(None, f, l, e) }, { u:User => Some((u.firstName, u.lastName, u.email)) })
}
我想执行Select *并返回UsersTable
中的所有行。是否可以使用UsersTable投影执行此操作?我见过一些看起来像这样的例子
UsersTable.where(_.fName startsWith "H").list
选择符合条件的行。如何在不传递任何内容的情况下执行此操作?
谢谢!
答案 0 :(得分:4)
您需要做的就是:
val query = for(r <- MyTable) yield r
val results = query.list
第一行创建表示select * from MyTable
之类的实际查询对象,第二行实际调用该对象并将结果加载到内存中。
您可能想要了解的重要含义是tableToQuery
,MyTable
允许queryToQueryInvoker
对其进行理解;和list
,它使查询受到影响,使其具有val query: Query[User] = MyTable
等方法。
或者你可以做一些像
这样的事情tableToQuery
应该使用{{1}}隐式来满足类型要求。
答案 1 :(得分:0)
有关Query
类的所有方法,请参阅http://scalaquery.org/doc/api/scalaquery-0.9.4/#org.scalaquery.ql.Query。
您还可以使用for-comprehensions查询表格:
for {
record <- MyTable if record.column0 === "foo"
} yield record.column1 ~ record.column2
答案 2 :(得分:0)
我现在用val userQuery = UsersTable.where(_.email =!= "")
完成了它。但我确定这不是最好的答案。所以保持开放。