Sélection d'une seule ligne par ID doit être une chose simple à faire, mais je n'ai pas beaucoup de mal à comprendre comment mapper cela à mon objet.
J'ai trouvé Cette question qui recherche le Même chose, mais la réponse donnée ne fonctionne pas pour moi. P>
J'ai actuellement cela qui fonctionne, mais cela ne semble pas aussi élégant que possible. P>
case class Category( id: Long = 0L, name: String ) object Category extends Table[Category]("categories"){ def name = column[String]("name", O.NotNull) def id = column[Long]("id", O.PrimaryKey, O.AutoInc) def * = id ~ name <> (Category.apply _, Category.unapply _) ... }
3 Réponses :
Tout d'abord, vous pouvez essayer d'utiliser une version désuturée du même code:
Category.filter{ _.id === id }.firstOption
Ou même .first code> si vous êtes sûr que votre requête renvoie un objet. Et n'est-ce pas
requête (catégorie) ... code>?
@alno J'avais déjà déjà basculé vers la version du filtre et je n'ai tout simplement pas mis à jour mon code ici. Mais en utilisant catégorie.filter (_. Id === id) .Firstoption code> me donne
MisMatch; Trouvé: option [scala.slick.Lifted.NothingContainer # matrenothing] Obligatoire: option [modèles.category] code> C'est pourquoi je suis passé à la liste.Opprtion en premier lieu.
Il suffit de tester - j'obtiens l'option [scala.slick.Lifted.NothingContainer # Tableau] Dans les deux variantes, la table d'emballage dans la requête (catégorie) aide.
@alno quand j'utilise Query (catégorie) Code> I Obtenir une erreur SQL Erreur
Erreur dans SQL Syntaxe près de "Option SQL_Select_Limit = Par défaut" code>
Vous pouvez le faire: Si vous utilisez cette requête assez souvent, vous devez envisager Ceci créera une instruction préparée précompilée que vous pouvez utiliser à partir de votre méthode p> QueryTemplate Code>: P>
Val byid = t.createfderBy (t => t.id) code> p>
def getingle (ID: LONG): OPTION [CATÉGORIE] = SYID (ID) .Firstoption CODE> P> P>
Si j'utilise la première solution, vous avez publié i get erreur dans SQL Syntaxe près de "option sql_select_limit = par défaut" code>
Pourrait être une question de pilote. Jetez un coup d'œil à
Mis à jour sur "MYSQL"% "MySQL-Connector-Java"% "5.1.25" Code>. Fonctionne génial, merci!
@Nilanjan Bit Nicer, "Val de byid = t.createfderby (_. Id)"
J'utilise Slick 1.0.1 avec Play 2.2.1 et les œuvres suivantes pour moi. puis l'appelez à partir d'une méthode. P> def findById(id: Int)(implicit session: Session): Option[Category] = {
Category.byId(id).firstOption
}