В anorm есть много похожих методов дао, верно? - PullRequest
4 голосов
/ 21 февраля 2012

Я использую Play2 с анормой. Я думаю, что дух анорма - писать простые sqls, без магии.

Но я быстро обнаружил, что написал много похожих методов дао. Например:

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)

Это работает, но я не думаю, что это рекомендовано анормой.

Как лучше всего решить эту проблему?

1 Ответ

3 голосов
/ 21 февраля 2012

Почему вы считаете, что это не рекомендуется или нормально?

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)
}

Это простой пример, расширяйте по мере необходимости.

...