11

次の SLICK クエリを使用して、名前フィールドがいくつかの値基準に一致し、名前列で並べ替えられたデータ テーブルのページングされた結果を取得します。

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 メソッドで必要な型に取得するにはどうすればよいですか?

4

1 に答える 1

11

これを行うことで、ある種の安全性が失われますが、このようなアプローチは、最も害が少ないかもしれません。

これは、Slickのドキュメントのコーヒーの例です。列のサブセットを「index」でアドレス指定する必要があると仮定します。この例では、何らかの理由で2つの価格Int列と、列としてアドレス指定する販売列01またはを持っているとしましょう2。。次のようなDRYの軽微な違反に耐えられる場合:

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の両方の列のベクトルです。IntDouble

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

もちろん、実行時に並べ替える列を選択することは、偽の列インデックスを処理する必要があることを意味します。k列のみがあり、k+1th列を要求する場合は、例外をスローするか、デフォルトの列をサイレントに選択する必要があります。これは、動的入力を通常は静的な(そしてタイプセーフな)ものに変換したいという結果です。

偽の列インデックスを除いて問題がない場合は、(例に戻ります)

 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 }
于 2013-01-29T15:42:09.277 に答える