Scala de la nappe de la requête d'origine dans la liste
J'essaie d'apprendre à utiliser Slick pour la requête MySQL. J'ai ce type de requête de travail pour obtenir une Visite unique objet:
Q.query[(Int,Int), Visit]("""
select * from visit where vistor = ? and location_code = ?
""").firstOption(visitorId,locationCode)
Ce que je voudrais savoir c'est comment puis-je changer la au-dessus de requête pour obtenir une Liste[Visitez] pour une collection de Lieux...quelque chose comme ceci:
val locationCodes = List("loc1","loc2","loc3"...)
Q.query[(Int,Int,List[String]), Visit]("""
select * from visit where vistor = ? and location_code in (?,?,?...)
""").list(visitorId,locationCodes)
Est-ce possible avec Slick?
- N'est-ce pas le travail? Devrait fonctionner.
- Ne pouvez pas vous en tenir à des n-Uplets de valeurs? Il permettrait de garantir que le nombre de paramètres que vous passez à la requête est fixe.
Vous devez vous connecter pour publier un commentaire.
Que les autres de répondre à l'indique, c'est lourd à faire avec statique des requêtes. La statique de la requête de l'interface vous demande de décrire l'lier des paramètres comme
Product
.(Int, Int, String*)
n'est pas valide scala, et à l'aide de
(Int,Int,List[String])
besoin de quelques kludges ainsi. En outre, l'obligation de s'assurer quelocationCodes.size
est toujours égal au nombre de(?, ?...)
que vous avez dans votre requête est fragile.Dans la pratique, ce n'est pas trop un problème parce que vous voulez être à l'aide de la requête de l'errance de la place, qui est de type sécurisé et la méthode recommandée pour l'utilisation de la Nappe de.
C'est en supposant que vous avez votre place à des tables comme ceci:
Notez que vous pouvez toujours placer votre requête dans une méthode.
val ids = List(1,2,3) | val result: DBIO[Seq[T]] = query.filter(_.id inSet ids)
par stackoverflow.com/questions/17408444/...?Cela ne fonctionne pas car le
StaticQuery object
(Q
) prévoit implicitement définir les paramètres dans la chaîne de requête, en utilisant les paramètres de type de laquery
méthode pour créer une sorte de setter objet (de typescala.slick.jdbc.SetParameter[T]
).Le rôle de
SetParameter[T]
est de définir une requête paramètre une valeur de typeT
, où les types sont prises à partir de laquery[...]
des paramètres de type.De ce que je vois il n'y a aucun objet défini pour
T = List[A]
pour un génériqueA
, et il semble un choix judicieux, puisque vous ne pouvez pas écrire une requête sql avec une liste dynamique des paramètres pour laIN (?, ?, ?,...)
clauseJ'ai fait une expérience en fournissant une valeur implicite par le code suivant
avec cette portée, vous devriez être en mesure d'exécuter votre code
Mais vous devez toujours manuellement garantir que
locationCodes
taille est la même que le nombre de?
dans votreIN
clauseEn fin de compte, je crois qu'un nettoyeur de solution de contournement peut être créé à l'aide de macros, de généraliser sur le type de séquence. Mais je ne suis pas sûr que ce serait un choix judicieux pour le cadre, étant donné les questions mentionnées ci-dessus avec la nature dynamique de la taille de la séquence.
Vous pouvez générer à la clause automatiquement comme ceci:
Et l'utilisation implicite SetParameter comme pagoda_5b dit
Si vous avez une requête complexe et la compréhension mentionnés ci-dessus n'est pas une option, vous pouvez faire quelque chose comme ce qui suit dans la Nappe de 3. Mais vous devez vous assurer de valider les données dans votre liste de paramètre de requête-vous pour empêcher l'injection SQL:
Le # devant la variable de référence désactive le type de validation et permet de résoudre ce sans fournir une fonction pour la conversion implicite de la liste des paramètres de la requête.