2017-12-22 41 views
0

play-slick을 사용하여 열거 형을 업데이트하는 방법을 알아내는 데 문제가 있습니다.play slick updating 열거 형 열

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를 사용하여 ID를 업데이트하는 것이 좋습니다.

+0

볼 수 있습니다 보인다. 'TestQuery'가 범위에서 적절한 열 매핑을 가지고 있는지 명확히 할 수 있습니까? 실험을 위해서'TestQueries' 안에'statusColumn' 값을 복사하고 컴파일하는지 확인하십시오. – AdamBat

+0

@AdamBat 내 코드에서 약간 불분명하지만, 다양한 결과 ('TestStatus' 개체 수준뿐만 아니라'TestQueries' 수준)에 대해서도 동일한 결과를 가진 다양한 범위로 열 매핑을 복사하려고했습니다. – itadoatL

+0

복제 된 문제가있는 저장소를 제공 할 수 있습니까? 난 임시 코드를 복사하고 동일한 컴파일러 오류있어. 위의 설명에서 제안한 것처럼'TestQueries'에서'TestStatus' 열 매핑을 복제하면 문제를 해결하는 데 도움이됩니다. 다음은 내가 한 일을 보여주는 요지입니다. https://gist.github.com/Dasiu/ae4fa9bfa9077569e5e07a02aa1493f0 – AdamBat

답변

0

TestStatus.Value의 사용자 정의 열 유형을 정의해야합니다. 같은 귀하의 예제에서 하나 암시 해상도 실패 (또는 더 나은 아직 정의 어디든지 가져올 수

implicit def testStatCT: BaseTypedType[TestStatus.Value] = 
    MappedColumnType.base[TestStatus.Value, String](
    enum => enum.toString, str => TestStatus.withName(str) 
) 

이 암시 적 요구 : 이것은 당신이 이미 지원 유형으로 매핑하여 사용자 정의 열 유형을 구축 할 수 있습니다 방법 매끄러운입니다 TestStatus 개체에서 항상 사용할 수 있습니다.)이 방법은 매끄럽게하는 것이 TestStatus.ValueBaseTypedType이라는 증거를 가질 수 있습니다. 이는 기본적으로 무엇인가가 지원되는 열 유형이라는 것을 의미합니다. 단지`Tests` 클래스는 TestStatus``에 대한 암시 열 매핑을 가지고 같은

더 열 매핑에서 읽은 당신은 Slick Documentation