play-slickを使用して列挙型の列を更新する方法を理解できません。play slick update列挙型列
object TestQueries extends TableQuery[Tests](new Tests(_)) {
def updateStatus(id: String, newStatus: TestStatus) = {
TestQueries.filter(_.id === id).map(_.status).update(newStatus)
}
}
[error] Slick does not know how to map the given types.
[error] Possible causes: T in Table[T] does not match your * projection,
[error] you use an unsupported type in a Query (e.g. scala List),
[error] or you forgot to import a driver api into scope.
[error] Required level: slick.lifted.FlatShapeLevel
[error] Source type: slick.lifted.Rep[models.TestStatus.Value]
[error] Unpacked type: T
[error] Packed type: G
[error] TestQueries.filter(_.id === id).map(_.status).update(newStatus)
[error] ^
:
class Tests(tag: Tag) extends Table[Test](tag, "tests") {
implicit val statusColumn = MappedColumnType.base[TestStatus, String](_.toString, TestStatus.withName)
override def * = (id, status) <> ((Test.apply _).tupled, Test.unapply)
val id = column[String]("id", 0.PrimaryKey)
val status = column[TestStatus]("status")
}
私が行くとテストの行を更新しようと、私はエラーを取得:
object TestStatus extends Enumeration {
type TestStatus = Value
val Status1 = Value("Status1")
}
case class Test (
id: String,
status: TestStatus
)
とテーブルマッピング:
は、ここに私の列挙型とケースクラスです
IntelliJはTestQueries.filter(_.id === id).map(_.status)
のタイプがQuery[Nothing, Nothing, Seq]
であることを示していますsを更新関数ではなく特定の列で更新します。
IDを更新すると、同じ構造を使用して問題なく動作します。
で見ることができ、列マッピングのさらに読み取りのために
のみ 'Tests'クラスはTestStatus''のための暗黙の列マッピングを持っているように思えます。 'TestQueries'のスコープ内に適切な列マッピングがあるかどうかを明確にすることができますか?実験のために、 'TestQueries'の中で' statusColumn'の値を複製し、それがコンパイルされているかどうか確認してください。 – AdamBat
@AdamBat私のコードからは少しはっきりしていませんが、さまざまなスコープに列マッピングをコピーしようとしました: 'TestStatus'オブジェクトレベルと' TestQueries'レベル、すべてが同じ結果です。 – itadoatL
複製された問題をリポジトリに提供できますか?私はあなたのコードをアドホックにコピーし、同じコンパイラエラーが発生しました。私が提案したように、 'TestQueries'に' TestStatus'カラムマッピングを複製することは、上記のコメントで問題の解決に役立ちました。ここに私が何をしたかを示す私の要点があります:https://gist.github.com/Dasiu/ae4fa9bfa9077569e5e07a02aa1493f0 – AdamBat