Идиоматический способ обработки критериев JPA в Котлине - PullRequest
1 голос
/ 14 октября 2019

У меня есть запрос на основе 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, учитывая, что у него нет троичного оператора ? :?

Обратите внимание, что некоторые из свойств, которые мне нужно упорядочить, могут быть вложенными свойствами корневого объекта, поэтому просто извлечь это из метода, который принимает строку в качестве имени предложения порядка, может быть нелегко.

1 Ответ

1 голос
/ 14 октября 2019

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"
            }
    ))
    ...
 }
...