Grails: добавление сортировки и подкачки к пользовательскому HQL-запросу - PullRequest
3 голосов
/ 31 июля 2009

У меня есть метод списка, который использует HQL. Как добавить параметры подкачки и сортировки в этот запрос?

   def list = {
         def termList
        log.info "Getting terms for product: $params.productId"
        params.max = 10
        def p = Product.get(params.productId)
        if (p) {
            log.info "Product found: $p.name"
            termList = Term.executeQuery("select distinct t from Term as t join t.definitions def join def.definitionProducts dp where dp.product=?",
                p )

        } else {
            log.info "No Product found"
            termList = Term.list(params)

        }
        log.info "Terms found: $termList.size"

        [ termInstanceList: termList, termInstanceTotal: termList.size]
    }

Ответы [ 3 ]

7 голосов
/ 22 сентября 2009

Я столкнулся с той же проблемой; в то время как вы можете указать max и offset в параметрах executeQuery, сортировка и порядок будут игнорироваться. Чтобы это работало, мне нужно было указать сортировку и порядок в самом HQL-запросе. Результирующий запрос должен выглядеть примерно так:

"select distinct a.number from Account a where a.branch = :branch order by a.id asc"

Во-первых, в ваших сортируемых столбцах вам необходимо изменить атрибут свойства, чтобы он ссылался на запрашиваемый домен. Так что для "Аккаунта а" сделайте это:

<g:sortableColumn property="a.id" title="Id"/>

Далее вам нужно будет изменить ваш HQL-запрос. К сожалению, похоже, что вы не можете использовать именованные параметры в предложении order by, поэтому вам придется делать это вручную. Вероятно, было бы неплохо сначала очистить params.order и params.sort.

"select distinct a.number from Account a where a.branch = :branch order by " +  params.sort + " " params.order

Это сработало для меня, я действительно надеюсь, что есть лучший выход.

3 голосов
/ 01 ноября 2012

Будьте осторожны с добавлением непроверенных параметров в запрос SQL.

Я делаю проверку так:

params.sort =
    params.sort in ['id','name'] ? params.sort:'name'
params.order =
    params.order in ['asc','desc'] ? params.order:'asc'

Тогда я могу смело добавлять параметры в мой SQL-запрос

String sql = """
   SELECT NEW MAP(c.id as id, c.name as name) FROM Customer c
   WHERE c.partner.id = :id
   ORDER BY c.$params.sort $params.order
""".stripMargin()

И, наконец, запустить executeQuery

def customers = Customer.executeQuery(
    sql, 
    [id:params.long('id')],
    [max:params.long('max'),offset:params.long('offset')]
)
2 голосов
/ 31 июля 2009

Из документации:

// использование с картой именованных параметров и параметров пагинации (начиная с 0.5) Account.executeQuery («выберите отдельный номер a из учетной записи a, где a.branch =: branch», [branch: 'London', max: 10, offset: 5]);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...