2012-02-21 4 views
4

놀림과 함께 Play2를 사용하고 있습니다. 나는 어둠의 정신이 평범한 평원을 쓰고 있다고 생각합니다.많은 유사 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 절은 작은 차이가 거의 같은, 예외입니다. 그것은 작동

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

,하지만 난 그것을 anorm 권장 생각하지 않습니다

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

내가 행동을 호출 할 수 있습니다 :

그래서 나는 같은 findWhere() 방법을 만들었습니다.

이 문제를 해결하는 가장 좋은 방법은 무엇입니까?

답변

3

왜 권장되지 않거나 괜찮습니까?

Anorm은 SQL 쿼리를 받고 해당 결과를 사례 클래스로 파싱하는 것이 중요합니다. 제약 조건/디자인으로 인해 해당 SQL 요청을 dinamically 생성하면 아무런 차이가 없습니다.

내가 보는 유일한 문제는 그가 '?'입니다. 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) 
} 

이것은 간단한 예이며 필요에 따라 확장한다.

+1

SQL 문자열을 사용하지만 문자열을 작성하는 방법과 관련이 없습니다. 아니면 내가 너의 요점을 이해하지 못 하겠어! :) –