9

ID で 1 つの行を選択するのは簡単なはずですが、これをオブジェクトにマップする方法を理解するのに少し苦労しています。

同じものを探しているこの質問を見つけましたが、与えられた答えは私にはうまくいきません。

現在、これは機能していますが、本来あるべきほどエレガントではないようです。

def getSingle(id: Long):Option[Category] = withSession{implicit session =>
 (for{cat <- Category if cat.id === id} yield cat ).list.headOption
 //remove the .list.headOption and the function will return a WrappingQuery
}

headOptionリストを取得してから取得するのは、かさばって不必要だと思います。私は何かが欠けているに違いない。

それが役立つ場合は、ここに私のカテゴリコードがもっとあります

case class Category(
  id: Long = 0L,
  name: String
)
object Category extends Table[Category]("categories"){

  def name = column[String]("name", O.NotNull)
  def id = column[Long]("id", O.PrimaryKey, O.AutoInc)

  def * = id ~ name <> (Category.apply _, Category.unapply _)

  ...
}

Slick を使用して ID から Option[T] を取得する簡単な方法はありますか?

解決法ドライバーに問題がありました。使用できませんでし.firstOptionたが、mysql jdbc 5.1.25 にアップグレードしました。

4

3 に答える 3

9

あなたはこれを行うことができます:

def getSingle(id: Long):Option[Category] = withSession{implicit session =>
 Query(Category).where(_.id === id).firstOption 
}

このクエリを頻繁に使用する場合は、次の点を考慮する必要がありますQueryTemplate

val byId = t.createFinderBy( t => t.id )

これにより、メソッドから使​​用できるプリコンパイル済みの準備済みステートメントが作成されます

def getSingle(id: Long):Option[Category] = byId(id).firstOption

于 2013-07-18T14:00:12.530 に答える
4

まず、同じコードの脱糖バージョンを使用してみてください。

Category.filter{ _.id === id }.list.headOption

それははるかにきれいに見えます。

また、firstOption メソッドを使用することもできます。

Category.filter{ _.id === id }.firstOption
于 2013-07-18T13:54:28.787 に答える
0

私は Play 2.2.1 で slick 1.0.1 を使用しており、次のように動作します。

val byId = createFinderBy(_.id)

次に、メソッドから呼び出します。

  def findById(id: Int): Option[Category] = DB.withSession { implicit session =>
    Category.byId(id).firstOption
  }

DB.withSession は play フレームワークのメソッドであることに注意してください。

Play を使用していない場合、メソッドは次のようになります。

  def findById(id: Int)(implicit session: Session): Option[Category] = {
    Category.byId(id).firstOption
  }
于 2015-05-22T06:40:44.437 に答える