Как указать столбец SLICK Query sortBy из параметра времени выполнения?

У меня есть следующий скользкий запрос, чтобы получить результаты выгрузки для таблицы данных с полем name, соответствующим некоторым критериям значения и отсортированным по столбцу name

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 }

это работает нормально для меня, но теперь мне нужно иметь возможность передать параметр времени выполнения для метода sortBy что определяет столбец, по которому выполняется сортировка.
Мой метод, который вызывает запрос будет int который представляет индекс столбца в данных таблица.

Как я могу перейти от индекса столбца int к необходимому типу, требуемому методом sortBy?

1 ответов


вы потеряете некоторую безопасность типа, делая это, но, возможно, такой подход будет болеть меньше всего:

это с примером кофе из документации Slick. Предположим вам хотите, чтобы подмножество ваших столбцов было адресовано 'index'. В нашем примере, давайте сидели, что у нас почему-то,2 цена Int колонки и продаж столбец, который мы адресуем как столбец 0, 1 или 2. . Если вы можете мириться с незначительное нарушение сухого, например:

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 
}

здесь Coffees.nth является вектором столбцов, обоих Int и Double.

scala> Coffees.nth
scala.collection.immutable.Vector[scala.slick.lifted.Column[_ >: Int with Double <: AnyVal]] = Vector(COFFEES.PRICE1, COFFEES.PRICE2, COFFEES.SALES)

конечно, выбирая столбец, чтобы сортировать по время работы подразумевает, что вы должны иметь дело с фиктивные индексы столбцов - если у вас есть только k столбцы и вы просите k+1колонна вам нужно либо создать исключение, либо молча выбрать столбец по умолчанию. Это следствие хочет перевести динамический вход в то, что обычно является статическим (и типизированный.)

если вы в порядке с исключением для фиктивного индекса столбца, то (возвращаясь к вашему примеру)

 def q(colIndx: Int) = ThirdParties.where(_.name like criteria).
       sortBy(_.nth(colIndx).asc.nullsLast).
       drop(offset).take(pageSize)

затем вызвать запрос

 val colIndx: Int = // gotten at runtime
 val thirdParties = (for(s <-q(colIndx)) yield(s)).list map { case t: ThirdParty => t }