【问题标题】:How I can reuse a SQUERYL order by clause?如何重用 SQUERYL order by 子句?
【发布时间】:2019-11-25 10:37:01
【问题描述】:

我目前正在使用这种非常糟糕的模式匹配对 Squeryl (0.9.9) 中各个字段的行进行排序:

sortBy match {
  case Some("checkId") => orderBy.getOrElse("DESC") match {
    case "ASC" => where(whereClause(chk)) select(chk) orderBy (chk.checkId asc)
    case _ => where(whereClause(chk)) select(chk) orderBy (chk.checkId desc)
  }
  case Some("checkName") => orderBy.getOrElse("DESC") match {
    case "ASC" => where(whereClause(chk)) select(chk) orderBy (chk.checkName asc)
    case _ => where(whereClause(chk)) select(chk) orderBy (chk.checkName desc)
  }
}

我需要在另一个查询中重用orderBypart,但我找不到隔离它的方法。

如果我尝试使用类似的东西:

def ord = orderBy(chk.checkId desc)

我收到语法错误。

更新: 更清楚我要做什么:

我可以定义这 3 个函数:

 def desc(node: ExpressionNode):ExpressionNode = new OrderByArg(node) {desc}
  def asc(node: ExpressionNode):ExpressionNode = new OrderByArg(node) {desc}

  def selectSorted2(chk: CheckResultsItem,  sortBy: Option[String], orderBy: Option[String]):ExpressionNode =
    sortBy match {
      case Some("checkId") => orderBy.getOrElse("DESC") match {
        case "ASC" => asc(chk.checkId )
        case _ => desc (chk.checkId )
      }
      case Some("checkName") =>     orderBy.getOrElse("DESC") match {
        case "ASC" =>asc (chk.checkName )
        case _ =>desc (chk.checkName )
      }

但是当我尝试使用它们时:

  val res = from(checkResultsTable)(chk => {
        where(chk.checkId === checkId) select(chk)  model.CheckResultsItem.selectSorted2(chk, sortBy, orderBy )
      }).page(offset_and_limit._1, offset_and_limit._2)

即使已定义、导入和可见,我总是无法解析符号“selectSorted2”。

【问题讨论】:

  • 你得到什么语法错误?你用的是什么版本的squeryl
  • 可能我真正的问题是:什么是“orderBy (chk.checkId asc)”以及如何构建一个返回它的函数?

标签: scala squeryl


【解决方案1】:

orderBy 运算符不是可以返回的东西。它是在特征org.squeryl.dsl.boilerplate.OrderBySignatures 中定义的方法。您需要定义自己的方法来接受 OrderBySignatures 类型的对象(或扩展它的类型,在这种情况下我相信它是SelectState)并调用该对象的 .orderBy 方法。如果您希望您的方法像 Squeryl 运算符一样运行,则需要从 SelectState -> YouModifiedSelectStateThatContainsYourMethod

进行隐式转换

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-14
    • 2011-09-07
    • 2018-03-23
    • 2012-04-09
    • 1970-01-01
    • 2012-08-08
    • 1970-01-01
    • 2017-12-07
    相关资源
    最近更新 更多