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?

Author: Magnus Smith, 2013-01-29

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+1tę 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 }
 10
Author: Faiz,
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