4

我正在使用带有异常的 Play2。我认为 anorm 的精神是编写简单的 sql,背后没有魔法。

但是我很快发现我已经写了很多类似的 dao 方法。例如:

case class User(id:Pk[String], username:String, email:String, realname:String, city:String, website:String)

object User {
  val simple = get[Pk[String]]("id") ~ get[String]("username") ~ ... get[String]("website") map {
    case id ~ username ~ ... ~ website = User(id, username, ..., website)
  }
  def findByUsername(username:String) = DB.withConnection { implicit connection =>
     SQL("select * from users where username={username}").on('username->username).as(simple.singleOpt)
  }
  def findByEmail(email:String) = DB.withConnection { implicit connection =>
     SQL("select * from users where email={email}").on('email->email).as(simple.singleOpt)
  }
  def findById(id:String) = DB.withConnection { implicit connection =>
     SQL("select * from users where id={id}").on('id->id).as(simple.singleOpt)
  }
  def findByRealname(keyword:String) = DB.withConnection { implicit connection =>
     SQL("select * from users where realname like {keyword}").on('keyword->"%"+keyword+"%").as(simple *)
  }
  // more similar methods
}

方法都差不多,只是where子句差别不大。

所以我创建了一个findWhere()方法:

def findWhere(conditon, values:Any*) = ...

我可以用行动来称呼它:

User.findWhere("id=?", id)
User.findWhere("username=?", username)

它有效,但我不认为它是 anorm 推荐的。

解决这个问题的最佳方法是什么?

4

1 回答 1

3

为什么您认为不推荐或可以?

Anorm 只关心接收 SQL 查询并将结果解析为案例类。如果由于您的约束/设计您动态地生成该 SQL 请求,那没有什么区别。

我看到的唯一问题是他'?char,这与 Anorm 的工作方式不同。我相信它会让我更喜欢:

User.findWhere("username", username)

def findWhere(field: String, value: String) = {
  SQL("select * from users where "+ field +"={"+ field +"}").on(Symbol(field)->value).as(simple.singleOpt)
}

这是一个简单的例子,根据需要扩展。

于 2012-02-21T15:43:44.910 回答