2016-07-08 4 views
0

이 슬릭 함수에서 저는 User 테이블을 읽고 SessionUser 개체를 반환합니다 (SessionUser는 User보다 적은 수의 열을가집니다).Slick 3.x에서 특정 열을 선택하면 형식 불일치가 발생합니다

문제는이 코드가 컴파일되지 않는다는 것입니다. SessionUser의 각 필드에 대해 오류 type mismatch; found : slick.lifted.Rep[String] required: String이 나옵니다. 이 오류의 의미는 무엇이며이를 수정하는 방법은 무엇입니까? 당신은 잘못된 장소에서 map 동작을 사용하고

def readByUserid (userid: String) : Option[SessionUser] = { 
    val db = Database.forConfig(Constant.dbBank) 
    try { 
     val users = TableQuery[UserDB] 
     val action = users.filter(_.userid === userid) 
      .map(u => SessionUser(u.userid, u.firstName, u.lastName)).result 

     val future = db.run(action) 
     val result = Await.result(future, Duration.Inf) 
     result 
    } 
    finally db.close 
    } 
+0

테이블 정의를 추가 할 수 있습니까? – Chobeat

답변

3

하십시오 Query 객체 위에 매핑은 SQL에서 SELECT 문의 것과 동일합니다. 당신은 바로 result 호출 후 map 작업을 배치해야합니다 :

val action = users.filter(_.userid === userid).result.map(_.headOption.map(u => SessionUser(u.userid, u.firstName, u.lastName))) 

우리가 users 테이블에서 세 개의 열을 사용하고 있기 때문에, 우리는 Query 객체에 map 작업을 사용하여 해당 표현할 수있다. 이렇게하면 기본 SQL 문에서 필요한 열만 선택하면됩니다.

val action = users.filter(_.userid === userid).map(u => (u.userid, u.firstName, u.lastName)).result.map(_.headOption.map { 
    case (userid, firstName, lastName) => SessionUser(userid, firstName, lastName) 
}) 
+0

이제'value userid 값이 Seq [user.manage.UserDB # TableElementType]의 멤버가 아닙니다. ' – ps0604

+0

'u'는 시퀀스이므로'u (0) .userid'를 사용하려고 시도했지만 작동합니다. select가 0 열을 반환하면이 충돌이 발생합니까? – ps0604

+0

'u (0) .userid'를 사용해 보았습니다. select가 레코드를 반환하지 않으면 어떤 아이디어도'IndexOutOfBoundsException : 0' 예외가 발생합니까? – ps0604