9
votes

Slick Select Row par ID

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

  ...
}


0 commentaires

3 Réponses :


4
votes

Tout d'abord, vous pouvez essayer d'utiliser une version désuturée du même code:

Category.filter{ _.id === id }.firstOption


4 commentaires

Ou même .first si vous êtes sûr que votre requête renvoie un objet. Et n'est-ce pas requête (catégorie) ... ?


@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 me donne MisMatch; Trouvé: option [scala.slick.Lifted.NothingContainer # matrenothing] Obligatoire: option [modèles.category] 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) I Obtenir une erreur SQL Erreur Erreur dans SQL Syntaxe près de "Option SQL_Select_Limit = Par défaut"



9
votes

Vous pouvez le faire: xxx

Si vous utilisez cette requête assez souvent, vous devez envisager QueryTemplate :

Val byid = t.createfderBy (t => t.id)

Ceci créera une instruction préparée précompilée que vous pouvez utiliser à partir de votre méthode

def getingle (ID: LONG): OPTION [CATÉGORIE] = SYID (ID) .Firstoption


4 commentaires

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"


Pourrait être une question de pilote. Jetez un coup d'œil à Stackoverflow.com/Questions/15113707/...


Mis à jour sur "MYSQL"% "MySQL-Connector-Java"% "5.1.25" . Fonctionne génial, merci!


@Nilanjan Bit Nicer, "Val de byid = t.createfderby (_. Id)"



0
votes

J'utilise Slick 1.0.1 avec Play 2.2.1 et les œuvres suivantes pour moi. XXX PRE>

puis l'appelez à partir d'une méthode. P>

  def findById(id: Int)(implicit session: Session): Option[Category] = {
    Category.byId(id).firstOption
  }


0 commentaires