ps0604
ps0604

Reputation: 1081

Selecting specific columns in Slick 3.x throws a type mismatch

In this Slick function I read from a User table and return a SessionUser object (SessionUser has fewer columns than User).

The problem is that this code does not compile, for each field in SessionUser it gives me the error type mismatch; found : slick.lifted.Rep[String] required: String. What's the meaning of this error and how to fix it?

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
  }

Upvotes: 1

Views: 4136

Answers (1)

Paweł Jurczenko
Paweł Jurczenko

Reputation: 4471

You're using map operation in a wrong place: mapping over a Query object is an equivalent of the SELECT statement in SQL. You should place your map operation right after the result invocation:

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

Since we are using only three columns from users table, we could express that by using map operation on a Query object. This way the underlying SQL statement will select only the columns we need:

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)
})

Upvotes: 7

Related Questions