To nie działa, ponieważ StaticQuery object
(Q
) spodziewa się domyślnie ustawić parametry w ciągu kwerendy przy użyciu parametrów rodzaj metody query
aby stworzyć coś w rodzaju setter obiektu (typu scala.slick.jdbc.SetParameter[T]
).
Rola SetParameter[T]
polega na ustawieniu parametru zapytania na wartość typu T
, gdzie wymagane typy są pobierane z parametrów typu query[...]
.
Z tego co widzę, nie ma takiego obiektu zdefiniowano dla T = List[A]
dla rodzajowego A
i wydaje się rozsądny wybór, ponieważ nie można właściwie napisać zapytanie SQL z dynamicznej listy parametrów dla IN (?, ?, ?,...)
klauzuli
zrobiłem eksperyment poprzez zapewnienie takiej wartości niejawny przez następujący kod
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]
z tym zakresie, powinny być w stanie wykonać swój kod
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)
Ale trzeba zawsze ręcznie zagwarantować, że rozmiar locationCodes
jest taka sama jak liczba ?
w IN
klauzuli
W końcu uważam, że odkurzacz Rozwiązaniem mogłyby być tworzone za pomocą makra generalizować na typie sekwencji. Ale nie jestem pewien, czy byłby to mądry wybór dla frameworka, biorąc pod uwagę wyżej wymienione problemy z dynamiczną naturą wielkości sekwencji.
Czy to nie działa? Powinno działać. –
Nie możesz trzymać się Krotek wartości? Gwarantuje to, że liczba parametrów przekazywanych do zapytania jest stała. –