加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 21:31:06 所属栏目:安全 来源:网络整理
导读:我有以下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 { cas
我有以下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方法所需的必需类型?

解决方法

通过这样做,您将失去一些类型的安全性,但也许这样做会伤害至少:

这是来自Slick文档的咖啡示例.我们假设你
需要您的列的一部分以“索引”寻址.在我们的例子中,我们来
坐了,我们有一些原因,2价格Int列和销售
我们以列0,1或2的方式寻址.
.
如果可以忍受DRY的轻微违规行为,例如:

object Coffees extends Table[(String,Int,Double,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列,并要求第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 }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读