Domanda

Sto usando Play2 con anorma. Penso che lo spirito di anorma sia scrivere semplici SQL, nessuna magia dietro.

Ma ho scoperto rapidamente che ho scritto molti metodi DAO simili. Per esempio:

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
}

Ci sono quasi gli stessi, eccezione il where La clausola ha una piccola differenza.

Quindi ho creato un findWhere() Metodo come:

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

Che posso chiamarlo in azioni:

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

Funziona, ma non penso che sia consigliato da Anorma.

Qual è il modo migliore per risolvere questo problema?

È stato utile?

Soluzione

Perché credi che non sia consigliato o ok?

Anorma si preoccupa solo di ricevere una query SQL e di analizzare il risultato in una classe di casi. Se a causa dei tuoi vincoli/design generano quella richiesta SQL dinamicamente, ciò non fa differenza.

L'unico problema che vedo è senza lui '?' Char, che non è il modo in cui funziona Anorm. Credo che mi farebbe più come:

User.findWhere("username", username)

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

Questo è un semplice esempio, esteso come richiesto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top