Проблемы с использованием критериев Grails с ассоциациями и пейджингом

У меня возникли проблемы с получением результатов, которые я хочу, используя построитель критериев. Допустим, у меня есть объект домена User, у которого есть Company. Теперь я хочу выполнить поиск с пейджингом:

def c = User.createCriteria()
def results = c.list(max: max, offset: offset) {
    or {
        ilike("name", someSearchTerm)
        ilike("username", someSearchTerm)
        company {
            ilike("name", someSearchTerm)
        }
    }
}

Это привело к использованию внутреннего соединения с ассоциацией, что привело меня к следующему:

def c = User.createCriteria()
def results = c.list(max: max, offset: offset) {
    createAlias("company", "c", CriteriaSpecification.LEFT_JOIN)
    or {
        ilike("name", someSearchTerm)
        ilike("username", someSearchTerm)
        ilike("c.name", someSearchTerm)
    }
}

Теперь это работает отлично. Однако это приводит меня к первому вопросу. CriteriaSpecification.LEFT_JOIN устарел. Чем его следует заменить?

Кроме того, часть пейджинга должна учитывать порядок. В документации четко указано, что я могу сделать:

def c = User.createCriteria()
def results = c.list(max: max, offset: offset) {
    createAlias("company", "c", CriteriaSpecification.LEFT_JOIN)
    or {
        ilike("name", someSearchTerm)
        ilike("username", someSearchTerm)
        ilike("c.name", someSearchTerm)
    }
    order("someAttribute", "asc")
}

но это приводит к ошибке, утверждающей, что order не может принимать String, String в качестве аргументов. Есть идеи?


ОБНОВЛЕНИЕ

Я нашел проблему. У меня была объявленная ранее переменная под названием order, которую я использовал, и замыкание пыталось использовать ее вместо метода критериев.


person Nico Huysamen    schedule 21.01.2014    source источник
comment
Это просто спасло мой день! Спасибо! Не мог понять, что, черт возьми, происходит не так!   -  person AForsberg    schedule 05.09.2017


Ответы (2)


Я нашел проблему. У меня была объявленная ранее переменная с именем order, которую я использовал, и замыкание пыталось использовать ее вместо метода критериев.

person Nico Huysamen    schedule 21.01.2014

Вы должны попробовать это.

def c = User.createCriteria()
def results = c.list(max: max, offset: offset) {
createAlias("company", "c", CriteriaSpecification.LEFT_JOIN)
or {
    ilike("name", someSearchTerm)
    ilike("username", someSearchTerm)
    ilike("c.name", someSearchTerm)
}
order(Order.asc('someAttribute'))
}
person user1791574    schedule 21.01.2014
comment
Та же проблема: No signature of method: java.lang.String.call() is applicable for argument types: (org.grails.datastore.mapping.query.Query$Order). - person Nico Huysamen; 21.01.2014
comment
Я нашел проблему. У меня была переменная с именем order, объявленная ранее в коде. - person Nico Huysamen; 21.01.2014