2016-07-08 1 views
0

Dans cette fonction Slick, je lis dans une table User et renvoie un objet SessionUser (SessionUser a moins de colonnes que User).La sélection de colonnes spécifiques dans Slick 3.x génère une incohérence de type

Le problème est que ce code ne compile pas, pour chaque champ dans SessionUser il me donne l'erreur type mismatch; found : slick.lifted.Rep[String] required: String. Quelle est la signification de cette erreur et comment la réparer?

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

Pouvez-vous ajouter la définition de la table? – Chobeat

Répondre

3

Vous utilisez map opération dans un mauvais endroit: la cartographie sur un objet Query est un équivalent de la déclaration SELECT dans SQL. Vous devez placer votre opération map juste après l'invocation result:

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

Puisque nous utilisons seulement trois colonnes de users table, nous pourrions exprimer qu'en utilisant map opération sur un objet Query. De cette façon, l'instruction SQL sous-jacente sélectionnera uniquement les colonnes dont nous avons besoin:

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

J'obtiens maintenant 'la valeur userid n'est pas un membre de Seq [user.manage.UserDB # TableElementType]' – ps0604

+0

'u' est une séquence, donc j'ai essayé d'utiliser' u (0) .userid' à la place et cela fonctionne, cependant ce crash se produirait-il si le select renvoyait des colonnes nulles? – ps0604

+0

J'ai essayé d'utiliser 'u (0) .userid' et quand la sélection ne renvoie aucun enregistrement, j'obtiens une exception' IndexOutOfBoundsException: 0', des idées? – ps0604