これを行うことで、ある種の安全性が失われますが、このようなアプローチは、最も害が少ないかもしれません。
これは、Slickのドキュメントのコーヒーの例です。列のサブセットを「index」でアドレス指定する必要があると仮定します。この例では、何らかの理由で2つの価格Int
列と、列としてアドレス指定する販売列0
、1
またはを持っているとしましょう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
の両方の列のベクトルです。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
th列を要求する場合は、例外をスローするか、デフォルトの列をサイレントに選択する必要があります。これは、動的入力を通常は静的な(そしてタイプセーフな)ものに変換したいという結果です。
偽の列インデックスを除いて問題がない場合は、(例に戻ります)
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 }