这样做会失去一些类型安全性,但也许这样的方法伤害最小:
这是 Slick 文档中的咖啡示例。假设您希望通过'index'来处理列的子集。在我们的示例中,假设由于某种原因,我们有2 个价格列和销售列,Int
我们将其称为 column或。. 如果您可以忍受轻微的 DRY 违规行为,例如: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
第 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 }