我正在使用Play2和anorm。我认为anorm的精神是简单的sqls,没有魔法。
但我很快发现我写了很多类似的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推荐的。
解决这个问题的最佳方法是什么?
答案 0 :(得分: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)
}
这是一个简单的例子,根据需要进行扩展。