Включение критериев максимального и смещения в критерии GORMBuilder возвращает ошибку.

Могу ли я сделать этот код короче?

if(count == null && from = null) {
    creditAdviceList = CreditAdvice.findAll {
        ilike('id', "%$idFilter%")
        .....
        ilike('statusCode', statusCodeFilter)
    }
}
else if(count != null && from == null) {
    creditAdviceList = CreditAdvice.findAll(max: count) {
        ilike('id', "%$idFilter%")
        .....
        ilike('statusCode', statusCodeFilter)
    }
}
else if(count == null && from != null) {
    creditAdviceList = CreditAdvice.findAll(offset: from) {
        ilike('id', "%$idFilter%")
        .....
        ilike('statusCode', statusCodeFilter)
    }
}
else if(count != null && from != null) {
    creditAdviceList = CreditAdvice.findAll(max: count, offset: from) {
        ilike('id', "%$idFilter%")
        .....
        ilike('statusCode', statusCodeFilter)
    }
}

Видите ли, это серия if операторов для каждого возможного сценария. Представьте себе, если бы можно было использовать также order и cache в параметре - в основном будет 16 уникальных if операторов!

Я пробовал этот [подробнее] более короткий код:

creditAdviceList = CreditAdvice.findAll {
    ilike('id', "%$idFilter%")
    .....
    ilike('statusCode', statusCodeFilter)

    if(count != null) {
        maxResults(count)
    }
    if(from != null) {
        firstResult(from)
    }
}

Но это дает мне ошибку:

...No signature of method: grails.gorm.DetachedCriteria.maxResults() is applicable for argument types: (java.lang.Integer)...

Я попытался преобразовать offset в int, Integer, String и т. Д. Я также опускаю оператор if внутри критериев, но возникает то же сообщение об ошибке.


person Gideon    schedule 21.07.2015    source источник
comment
Вторая версия может работать, вам просто нужно заменить findAll {...} на createCriteria (). List {...} :)   -  person Deigote    schedule 21.07.2015


Ответы (2)


findAll с переданным закрытием использует DetachedCriteria внутри, что отличается от результата, который вы получили бы от createCriteria, упомянутого в документации. Если Groovy найдет «что-то достаточно близкое», он сообщит вам об ошибке. Самый простой способ справиться с вашими максимальными / исходными требованиями - это просто использовать карту (которая является первым переданным аргументом). Например.:

def qcfg = [:]
if (count) {
    qcfg.count = count
}
if (from) {
    qcfg.offset = from
}
creditAdviceList = CreditAdvice.findAll(qcfg) { ... }

смешивать, сопоставлять, извлекать, сокращать по своему усмотрению

person cfrick    schedule 21.07.2015
comment
В IDE не должно быть кнопок копирования и вставки;) - person cfrick; 21.07.2015

Насколько я понимаю, разница только в параметрах нумерации страниц. Если мои глаза меня не обманывают, да, вы можете:

Map paginationArgs = [max: count, offset: from].findAll { 
   it.value != null 
}
List<CreditAdvice> creditAdviceList = CreditAdvice.findAll(paginationArgs) {
   ilike('id', "%$idFilter%")
   .....
   ilike('statusCode', statusCodeFilter)
}

Вы можете стилизовать его по-разному, но в основном вы можете сначала создать аргументы нумерации страниц и передать их findAll. Нет дублированного кода, более четкая ответственность за условия. Чтобы уточнить, я добавляю все параметры, а затем фильтрую их, чтобы исключить те, которые имеют значение NULL.

person Deigote    schedule 21.07.2015