0

次の 2 つの単純なクエリを想定します。

def findById(id: Long): Option[Account] = database.withSession { implicit s: Session =>
  val query = for (a <- Accounts if a.id === id) yield a.*
  query.list.headOption
}

def findByUID(uid: String): Option[Account] = database.withSession { implicit s: Session =>
  val query = for (a <- Accounts if a.uid === uid) yield a.*
  query.list.headOption
}

定型文の重複を削除して、次のように書き直したいと思います。

def findBy(criteria: ??? => Boolean): Option[Account] = database.withSession {
  implicit s: Session =>
    val query = for (a <- Accounts if criteria(a)) yield a.*
    query.list.headOption
}

def findById(id: Long) = findBy(_.id === id)

def findByUID(uid: Long) = findBy(_.uid === uid)

私はまだもつれを解いていない for 内包表記にいくつかの暗黙の変換が含まれているため、それを達成する方法がわかりません。より具体的に??? => Booleanは、findByメソッドの型は何ですか?

編集

これらは Account および Accounts クラスです。

case class Account(id: Option[Long], uid: String, nick: String)

object Accounts extends Table[Account]("account") {
  def id = column[Option[Long]]("id")
  def uid = column[String]("uid")
  def nick = column[String]("nick")
  def * = id.? ~ uid ~ nick <> (Account, Account.unapply _)
}
4

1 に答える 1

4

私はこのヘルパーテーブルを持っています:

abstract class MyTable[T](_schemaName: Option[String], _tableName: String) extends Table[T](_schemaName, _tableName) {
  import scala.slick.lifted._
  def equalBy[B: BaseTypeMapper]
    (proj:this.type => Column[B]):B => Query[this.type,T] = { (str:B) => 
     Query[this.type,T,this.type](this) where { x => proj(x) === str} }

}

今、あなたはすることができます:

 val q=someTable.equalBy(_.someColumn) 
 q(someValue)
于 2013-01-15T11:05:31.250 に答える