如何从运行时参数指定SLICK Query sortBy列?

时间:2013-01-29 12:43:23

标签: scala scalaquery slick

我有以下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方法所需的必要类型?

1 个答案:

答案 0 :(得分:10)

通过这样做你会失去一些类型的安全性,但是这样的方法可能会造成至少伤害:

这是Slick文档中的咖啡示例。我们假设你 希望您的列的子集通过'index'来解决。在我们的例子中,让我们来吧 我们出于某种原因坐了下来, 2 价格Int列以及销量 我们列为0列,12的列。 。 如果你能忍受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.nthIntDouble的列向量。

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 }