Anormには多くの同様のDAOメソッドがあります、それは正しいですか?

StackOverflow https://stackoverflow.com/questions/9371227

  •  28-10-2019
  •  | 
  •  

質問

AnormでPlay2を使用しています。 Anormの精神は、Splain SQLSを書くことであり、背後に魔法はありません。

しかし、私はすぐに多くの同様の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 節には小さな違いがあります。

だから私はaを作成しました findWhere() 方法として:

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

アクションでそれを呼ぶことができること:

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

動作しますが、Anormに推奨されているとは思いません。

この問題を解決するための最良の方法は何ですか?

役に立ちましたか?

解決

なぜあなたはそれが推奨されないか大丈夫だと信じているのですか?

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

これは簡単な例であり、必要に応じて拡張します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top