1

我在 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 

选择符合条件的行。我如何在不传递任何内容的情况下做到这一点?

谢谢!

4

3 回答 3

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隐式来满足类型要求。

于 2012-05-29T16:21:03.233 回答
0

I think this is what you are looking for: https://github.com/szeiger/scalaquery-examples/blob/master/src/main/scala/org/scalaquery/examples/FirstExample.scala#L73

See also http://scalaquery.org/doc/api/scalaquery-0.9.4/#org.scalaquery.ql.Query for all the methods of the Query class.

You can also use for-comprehensions to query your tables:

for {
  record <- MyTable if record.column0 === "foo"
} yield record.column1 ~ record.column2
于 2012-05-29T13:12:54.960 回答
0

我现在已经用val userQuery = UsersTable.where(_.email =!= ""). 但我确信这不是最好的答案。所以保持这个开放。

于 2012-05-29T16:08:57.253 回答