【问题标题】:Dynamic orderBy with Squeryl使用 Squeryl 的动态 orderBy
【发布时间】:2013-12-05 00:40:30
【问题描述】:

我不知道如何在运行时动态更改 orderBy。我需要类似的东西:

def samplesSorted(fields: List[String]) = {
  from(Schema.samples)(s => select(s) orderBy(fields.map(getterByName))
}

或者类似的东西

def samplesSorted(fields: List[String]) = {
  val q = from(Schema.samples)(s => select(s))
  fields.forEach(field => q.addOrderBy(getterByName(field)))
  q
}

我现在正在尝试编写一个帮助函数来操作 AST。但这似乎不是正确的解决方案。

【问题讨论】:

    标签: scala squeryl


    【解决方案1】:

    没有注意到有一个版本的 orderBy 可以接受 ExpressionNodes 列表。能够像这样解决它:

    def samplesSorted(fields: List[String]) = {
      from(Schema.samples)(s => select(s) orderBy(fields.map(buildOrderBy(s)))
    }
    def buildOrderBy(row: Row)(field: String): ExpressionNode = {
      getterByName(row, field)
    }
    def getterByName(row: Row, field: String): String = field match {
      case "Name" => row.name
      case "Address" => row.address
    }
    

    尚未尝试使用不同类型的字段 - 在这种情况下,隐式可能不起作用。但我总是可以明确地调用它们。

    更新:

    要对降序执行同样的操作,可以使用这样的帮助器:

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

    【讨论】:

      【解决方案2】:

      这对我有用

      def ord(dr: DataRow, name: String): ExpressionNode = if (orderAscending) {
        dr.getterByName(name) asc
      } else {
        dr.getterByName(name) desc
      }
      
      case class DataRow(id: Long,
        @Column("resource_id") resourceId: String,
      
        def getterByName(name: String) = {
          name match {
            case "resource_id" => resourceId.~
            case _ => id.~
          }
        }
      }
      
      from(DataSchema.dataRows) { dr =>
          where(dr.id === id).select(dr).orderBy(ord(dr, filedName))
      }.page(offset, limit)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-12-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多