Question

J'utilise Play2 avec anorm.Je pense que l'esprit d'anorm est d'écrire des sqls simples, pas de magie derrière.

Mais j'ai rapidement découvert que j'avais écrit beaucoup de méthodes Dao similaires.Par exemple:

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
}

Certaines méthodes sont presque les mêmes, sauf que la clause where a une petite différence.

J'ai donc créé une méthode findWhere() comme:

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

Que je peux l'appeler en actions:

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

Cela fonctionne, mais je ne pense pas que ce soit recommandé par anorm.

Quelle est la meilleure façon de résoudre ce problème?

Était-ce utile?

La solution

Pourquoi pensez-vous que ce n'est pas recommandé ou correct?

Anorm se soucie uniquement de recevoir une requête SQL et d'analyser le résultat dans une classe de cas.Si en raison de vos contraintes / conception vous générez cette requête SQL de manière dynamique, cela ne fait aucune différence.

Le seul problème que je vois est avec lui '?'char, qui n'est pas la façon dont fonctionne Anorm.Je crois que ça me plairait plus:

User.findWhere("username", username)

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

Ceci est un exemple simple, étendez-le si nécessaire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top