1

(私は Scala と Slick の完全な初心者なので、あらゆる種類のコード レビューを歓迎します)

私は次classのSlickをTable定義しています:

case class Foo(title: String, description: String, id: Int = 0)

class FooTable(tag: Tag) extends Table[Foo](tag, "FOO") {

  def id = column[Int]("ID", O.PrimaryKey, O.AutoInc)
  def title = column[String]("TITLE", O.NotNull)
  def description = column[String]("DESCRIPTION")

  def * = (title, description, id) <> (Foo.tupled, Foo.unapply)
}

指定した に一致する のListを返すメソッドを追加したいと考えています。このようなもの:Footitle

def findByTitle(title: String) = DB.withSession { implicit s: Session =>
  <FooTable TableQuery>.filter(_.title === title)
}

次に、次のような方法を使用できます。

val foos = TableQuery[FooTable]
DB.withSession { implicit s: Session =>
  val anId = foos.findByTitle("bar")
}

TableQuery特定の に作用するメソッドをどこにどのように追加できTableますか? これは私のアプリケーションを手配する正しい方法ですか?

4

2 に答える 2

2
implicit class FooTableExtensions(q: Query[FooTable,Foo]){
  def findByTitle(t: String) = q.filter(_.title === t)
}

foos.findByTitle("Bar")

Scala eXchange 2013 の Web サイトでの講演をご覧ください。

ただし、コンパイル済みのクエリの場合は、コンパイル済みのクエリをキャッシュできる DAO があると便利です。Scala Days 2013 の講演を参照してください。それ以来、構文は変更されています。のマニュアルを確認してくださいCompiled

于 2014-07-08T09:09:14.287 に答える
1

あなたが望むのはDAO(データアクセスオブジェクト)を導入することだと思います。必要に応じて、FooTableクラスのコンパニオンオブジェクトをDAOにすることができFooTable.findByTitle()、コードベースの残りの部分から呼び出すことができます。

于 2014-07-08T08:38:42.240 に答える