6

クラスとテーブルの定義は次のようになります。

case class Group(
  id: Long = -1,
  id_parent: Long = -1,
  label: String = "",
  description: String = "")

  object Groups extends Table[Group]("GROUPS") {
    def id = column[Long]("ID", O.PrimaryKey, O.AutoInc)
    def id_parent = column[Long]("ID_PARENT")
    def label = column[String]("LABEL")
    def description = column[String]("DESC")
    def * = id ~ id_parent ~ label ~ design <> (Group, Group.unapply _)
    def autoInc = id_parent ~ label ~ design returning id into {
      case ((_, _, _), id) => id
    }
  }

レコードを更新するには、次のようにします。

  def updateGroup(id: Long) = Groups.where(_.id === id)

  def updateGroup(g: Group)(implicit session: Session) = updateGroup(g.id).update(g)

しかし、 for 式を使用して動作するように更新を取得できません。

  val findGById = for {
    id <- Parameters[Long]
    g <- Groups; if g.id === id
  } yield g

  def updateGroupX(g: Group)(implicit session: Session) = findGById(g.id).update(g)
  ----------------------------------------------------------------------------^
Error: value update is not a member of scala.slick.jdbc.MutatingUnitInvoker[com.exp.Group]

私は明らかにドキュメントに何かが欠けています。

4

2 に答える 2

7

updateメソッドは type によって提供されますUpdateInvoker。そのタイプのインスタンスは、スコープ内にある場合Query、メソッドproductQueryToUpdateInvokerおよび/またはtableQueryToUpdateInvoker( にある) によってから暗黙的に作成できます。BasicProfile

現在、findByIdメソッドのタイプは aQueryではなく aBasicQueryTemplate[Long, Group]です。ドキュメントを見ると、BasicQueryTemplate(のサブタイプであるStatementInvoker) a から an への方法が見つかりませUpdateInvokerん。暗黙的でも明示的でもありません。考えてみると、クエリ テンプレート (呼び出し元) は、抽象構文ツリー () からプリペアド ステートメントに既に "コンパイル" されているものであると理解しているためQuery、パラメーター化の前に、それはちょっと理にかなっています。インボーカーはQuery、クエリを分析してそのパラメーター/列を抽出する必要があるため、抽象構文ツリー、つまりオブジェクトからのみ構築できます。少なくとも、現在はそのように機能しているようです。

それを念頭に置いて、可能な解決策が展開されます。

def findGById(id: Long) = for {
  g <- Groups; if g.id === id
} yield g

def updateGroupX(g: Group)(implicit session: Session) = findGById(g.id).update(g)

Whereは、メソッドを最終的に呼び出すことができるによって変換される型を持っfindById(id: Long)ています。Query[Groups, Group]productQueryToUpdateInvokerUpdateInvoker[Group]update

これが役に立ったことを願っています。

于 2013-02-26T21:58:17.250 に答える
4

http://madnessoftechnology.blogspot.ru/2013/01/database-record-updates-with-slick-in.htmlを参照してください。

今日は更新に固執しましたが、このブログ投稿は私を大いに助けてくれました。投稿の下の最初のコメントも参照してください。

于 2013-08-05T18:19:24.787 に答える