在 Kotlin 中处理 JPA 标准排序的惯用方式
Idiomatic way to handle JPA criteria ordering in Kotlin
我有一个基于 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 没有三元 ? :
运算符,是否有更好、可能更惯用的方法来执行此操作?
请注意,我需要排序的某些属性可能是根对象的子属性,因此仅将其提取到采用字符串作为排序子句名称的方法可能并不容易。
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"
}
))
...
}
我有一个基于 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 没有三元 ? :
运算符,是否有更好、可能更惯用的方法来执行此操作?
请注意,我需要排序的某些属性可能是根对象的子属性,因此仅将其提取到采用字符串作为排序子句名称的方法可能并不容易。
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"
}
))
...
}