我有以下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方法所需的必要类型?
答案 0 :(得分:10)
通过这样做你会失去一些类型的安全性,但是这样的方法可能会造成至少伤害:
这是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
列
您要么抛出异常,要么默默选择默认列。那是一个
想要将动态输入转换为通常静态的结果(和
类型安全)。
如果您对伪造列索引的异常没有问题,那么(回到您的示例)
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 }