Как мне отсортировать недвижимость в Grails? - PullRequest
3 голосов
/ 19 апреля 2011

Я пытаюсь отсортировать таблицу данных.У меня есть следующий домен (перефразированный и пример-ified):

class Car {
    Engine engine
    static constraints = {
        engine nullable: true // poor example, I know
    }
}

class Engine {
    String name
}

Вот действие контроллера, которое обрабатывает сортировку:

def myAction = {
    def list = Car.findAll(params)
    render(view: 'list', model: [list: list])
}

Я предоставляю некоторые данные, такие как несколько автомобилейнекоторые из них с нулевыми двигателями, а другие с ненулевыми двигателями.

Я пытаюсь выполнить следующий запрос:

http://www.example.com/myController/myAction?sort=engine.name&order=asc

Результаты запроса возвращают только записи автомобилей, двигатель которых не равен нулю.Это отличается от результатов, которые были бы возвращены, если бы я только запросил ассоциацию (без ее свойства):

http://www.example.com/myController/myAction?sort=engine&order=asc

, которая выдаст все результаты Car, сгруппировав результаты сnull engine вместе.

Есть ли способ, что:

  • Я могу получить запрос, который сортируется по свойству ассоциации, чтобы вернуть те же результаты, что и тот, который сортирует только по ассоциации(с нулевыми ассоциациями, сгруппированными вместе)?
  • Я могу достичь этих результатов, используя встроенную сортировку, переданную в list() (т.е. без использования критерия или запроса HQL)

1 Ответ

3 голосов
/ 19 июня 2013

Вам необходимо указать LEFT_JOIN в запросе, попробуйте это:

import org.hibernate.criterion.CriteriaSpecification

...

def list = Car.createCriteria().list ([max:params.max?:10,  offset: params.offset?:0 ]){

        if (params.sort == 'engine.name') {
            createAlias("engine","e", CriteriaSpecification.LEFT_JOIN)
            order( "e.name",params.order)

        } else {                
            order(params.sort, params.order)
        }
    }

Не забудьте указать engine.name в качестве свойства для заказа в вашем списке .gsp

<g:sortableColumn property="engine.name" title="Engine Name" />
...