50 votes

Comment mettre à jour plusieurs colonnes en utilisant Slick Lifted Embedding ?

Comment mettre à jour plusieurs colonnes en utilisant Slick Lifted Embedding ? Ce document ne dit pas grand-chose.

Je m'attendais à ce que ce soit quelque chose comme ça

Query(AbilitiesTable).filter((ab: AbilitiesTable.type) => ab.id === ability_id).map((ab: AbilitiesTable.type) => (ab.verb, ab.subject)).update("edit", "doc")

79voto

nemoo Points 790

Avec les versions récentes de Slick, cette façon d'écrire fonctionne :

Users.filter(_.id === filterId)
     .map(x => (x.name, x.age))
     .update(("john", 99))

Veillez à ne pas oublier les parenthèses supplémentaires si vous mettez à jour plus d'une propriété, sinon vous risquez d'obtenir un avertissement du compilateur.

3 votes

Dans intellij, la virgule peut ne pas fonctionner. Vous pouvez écrire comme ceci (x.name ~ x.age)

2 votes

Dans la version 2016 d'Intellij, la virgule semble fonctionner correctement.

1 votes

N'oubliez pas les tuples dans .map(x => (...)) ainsi que dans update(("x", "y")) donc double parenthèse.

76voto

ruslan Points 5754

J'ai trouvé la solution. Ça devrait être comme ça

val map = Query(AbilitiesTable)
  .filter(_.id === ability_id)
  .map(ab => ab.verb ~ ab.context)

map.update(("", ""))

Typesafe pourquoi votre documentation est si mauvaise ? Je dois chercher sur Google presque toutes les choses stupides ou fouiller dans les tests unitaires pendant des heures. S'il vous plaît, améliorez-la. Merci.

10 votes

Notez que cela ne fonctionne qu'avec les ensembles de résultats actualisables, pour lesquels vous devez inclure l'ID. Si vous essayez d'utiliser cette fonction sans inclure le champ ID dans la requête construite, elle échouera.

0 votes

Désolé... mais qu'est-ce que AbilitiesTable ? Est-ce que c'est TableQuery objet ? La classe comme ceci : class CompanyTable(tag: Tag) extends Table[Company] ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X