Non funziona perché il StaticQuery object
(Q
) prevede di impostare i parametri implicitamente nella stringa di query, utilizzando i parametri di tipo del metodo query
per creare una sorta di oggetto setter (di tipo scala.slick.jdbc.SetParameter[T]
).
Il ruolo di SetParameter[T]
consiste nel impostare un parametro di query su un valore di tipo T
, in cui i tipi richiesti sono presi dai parametri di tipo query[...]
.
Da quello che vedo non c'è tale oggetto definito per T = List[A]
per un generico A
, e mi sembra una scelta sensata, dal momento che non si può effettivamente dare una query SQL con un elenco dinamico di parametri per la IN (?, ?, ?,...)
clausola di
ho fatto un esperimento, fornendo un valore così implicitamente attraverso il seguente codice
import scala.slick.jdbc.{SetParameter, StaticQuery => Q}
def seqParam[A](implicit pconv: SetParameter[A]): SetParameter[Seq[A]] = SetParameter {
case (seq, pp) =>
for (a <- seq) {
pconv.apply(a, pp)
}
}
implicit val listSP: SetParameter[List[String]] = seqParam[String]
con questa portata, si dovrebbe essere in grado di eseguire il codice
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)
Ma è necessario garantire sempre manualmente che la dimensione locationCodes
è lo stesso come il numero di ?
nel vostro IN
clausola
Alla fine credo che una soluzione più pulito potrebbe essere creato utilizzando le macro, generalizzare sul tipo di sequenza. Ma non sono sicuro che sarebbe una scelta saggia per il framework, dati i suddetti problemi con la natura dinamica della dimensione della sequenza.
Non funziona? Dovrebbe funzionare. –
Non riesci ad attenersi a Tuples di valori? Garantire che il numero di parametri che si passa alla query sia corretto. –