Jak określić SLICK Query sortBy column z parametru runtime?
Mam następujące zapytanie SLICK, aby uzyskać wyniki stronicowane dla tabeli danych z polem nazwa pasujące do niektórych kryteriów wartości i posortowane według kolumny Nazwa
val q = ThirdParties.where(_.name like criteria).sortBy(_.name.asc.nullsLast).drop(offset).take(pageSize)
val thirdParties = (for(s <-q) yield(s)).list map { case t: ThirdParty => t }
To działa ok dla mnie, ale teraz muszę być w stanie przekazać parametr runtime do metody sortBy, która identyfikuje kolumnę, na której wykonać sortowanie według.
Moja metoda wywołująca zapytanie będzie miała int, który reprezentuje indeks kolumny w tabeli danych.
How might I go about uzyskanie z indeksu kolumny Int do wymaganego typu wymaganego przez metodę sortBy?
1 answers
Będziesz tracił przez to pewne bezpieczeństwo typu, ale może takie podejście zaszkodziłoby najmniej:
To jest przykład kawy z Dokumentacji Slick. Załóżmy, że
chcesz, aby podzbiór Twoich kolumn był adresowany przez 'index' . W naszym przykładzie
sat that we have for some reason, 2 cena Int
kolumny, a także sprzedaż
kolumnę, którą określamy jako kolumnę 0
, 1
lub 2
.
.
Jeśli możesz znieść drobne naruszenie suchego, takie jak to:
object Coffees extends Table[(String, Int, Double, Double, Int, Int)]("COFFEES") {
def name = column[String]("COF_NAME", O.PrimaryKey)
def supID = column[Int]("SUP_ID")
def price1 = column[Double]("PRICE1")
def price2 = column[Double]("PRICE2")
def sales = column[Int]("SALES")
def total = column[Int]("TOTAL")
def * = name ~ supID ~ price1 ~ price2 ~ sales ~ total
def nth = Vector(price1, price2, sales) // Your index-addressable columns
}
Tutaj Coffees.nth
jest wektorem kolumn, zarówno Int
, jak i Double
.
scala> Coffees.nth
scala.collection.immutable.Vector[scala.slick.lifted.Column[_ >: Int with Double <: AnyVal]] = Vector(COFFEES.PRICE1, COFFEES.PRICE2, COFFEES.SALES)
Oczywiście wybranie kolumny do sort of runtime oznacza, że musisz poradzić sobie z
fałszywe indeksy kolumn - jeśli masz tylko k
Kolumny i prosisz o k+1
tę kolumnę
musisz albo rzucić wyjątek, albo po cichu wybrać domyślną kolumnę. To jest
konsekwencją chęci przełożenia dynamicznego wejścia na to, co zwykle statyczne (i
typu safe).
Jeśli nie ma problemu, jeśli chodzi o indeks fałszywych kolumn, to (wracając do twojego przykładu)
def q(colIndx: Int) = ThirdParties.where(_.name like criteria).
sortBy(_.nth(colIndx).asc.nullsLast).
drop(offset).take(pageSize)
Następnie wywołanie zapytania
val colIndx: Int = // gotten at runtime
val thirdParties = (for(s <-q(colIndx)) yield(s)).list map { case t: ThirdParty => t }
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-30 04:53:33