2012-02-21 57 views
4

我使用Play2和anorm。我認爲anorm的精神是寫平原,沒有魔力。在anorm中有很多類似的dao方法,是不是?

但我很快發現我寫了很多類似的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建議。

解決此問題的最佳方法是什麼?

回答

3

爲什麼你認爲這不是建議或好嗎?

Anorm只關心接收SQL查詢並將結果解析爲案例類。如果由於您的約束/設計,您可以以不同的方式生成該SQL請求,那就沒有區別。

我看到的唯一問題是,他是'?'字符,這是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) 
} 

這是一個簡單的例子,根據需要進行擴展。

+1

它使用SQL字符串,但是如何創建這些字符串與它無關。或者,也許我不瞭解你的觀點! :) – 2012-02-21 17:30:18

相關問題