我无法弄清楚如何在运行时动态更改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。但这似乎不是正确的解决方案。
答案 0 :(得分:2)
没有注意到有一个版本的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
}
尚未尝试使用不同类型的字段 - 在这种情况下,implicits可能无效。但我总是可以明确地称它们为。
UPD:
要按降序执行相同操作,可以使用类似这样的帮助程序:
def desc(node: ExpressionNode):ExpressionNode = new OrderByArg(node) {desc}
答案 1 :(得分:0)
这对我有用
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)