我有一个基于CriteriaBuilder
的查询,可以通过几个不同的属性对其进行排序。
当前正在以这种方式处理:
when(filters.sortBy) {
"foo" -> query.orderBy(if(isAsc) cb.asc("bar") else cb.desc("bar"))
"baz" -> query.orderBy(if(isAsc) cb.asc("quux") else cb.desc("quux"))
}
绝对不是我编写过的最具可读性或可维护性的代码。
[由于Kotlin中没有三元? :
运算符,在Kotlin中是否有更好且更惯用的方法?
请注意,我需要排序的某些属性可能是根对象的子属性,因此将其提取到以字符串作为order子句名称的方法中可能并不容易。
when
是一个表达式,因此您可以将其结果直接用作query.orderBy()
中的参数”>
此外,局部功能将有助于消除if-else复制部分
fun query(...) {
...
fun sort(name: String) = if (isAsc) cb.asc(name) else cb.desc(name)
query.orderBy(sort(
when (filters.sortBy) {
"foo" -> "bar"
"baz" -> "quux"
}
))
...
}