список grails не возвращает все, даже без указания максимального / смещения, в g: sortableColumn - PullRequest
1 голос
/ 09 ноября 2011

Фон: тег g: sortableColumn по умолчанию вызывает действие списка в контроллере, передавая ему параметр «sort», который указывает, по какому полю сортировать. В моем конкретном случае у меня есть класс / список проблем, которые я сортирую:

 class Issue {
     String title 
          ...
     User assignedTo
          ...
  }

и

 Class User {
    String lastName
     ...
 }

Указание свойства g: sortableColumn = "assignTo.lastName», которое преобразуется в параметр сортировки списка, прекрасно работает, если проблема была назначена - то есть assignTo не ноль. Но если это не так, то list () больше не возвращает его. Я не знаю, является ли это ошибкой list () или нет (комментарии?), Но я бы хотел, чтобы эти проблемы с нулевым назначенным значением пришли к концу.

Я думал о том, чтобы объединить Issue.list () с Issue.findAllByAssignedToIsNull (), но это потребует согласования max / offset в обоих случаях, которых я бы предпочел избежать, если это возможно.

Мысль / комментарии?

------- за комментарий ------

Это стандартное (Grails 1.3.7) действие списка лесов, т. Е .:

   def list = {
    params.max = Math.min(params.max ? params.int('max') : 10, 100)
    [issueInstanceList: Issue.list(params), issueInstanceTotal: Issue.count()]
}

----- за второй комментарий (мой) ------------------------------------ ----

Я также попробовал следующее, еще раз он не возвращал Проблемы, где assignTo был нулевым:

 <g:sortableColumn property="assignedTo.lastName" title="${message(code: 'issue.assignedTo.label', default: 'Assigned To')}" />

 def list = {
   if (params.sort == 'assignedTo.lastName') {
      println "doing special find/sort by: ${params.sort}"
      return [issueInstanceList: Issue.findAllByAssignedToIsNullOrAssignedToIsNotNull(params), issueInstanceTotal: Issue.count()]
   }
   [issueInstanceList: Issue.list(params), issueInstanceTotal: Issue.count()]
 } 

Ответы [ 2 ]

1 голос
/ 09 ноября 2011

Вы должны принудительно выполнить левое соединение на пользовательском столе. Вот один из способов сделать это с помощью критерия запроса:

import org.hibernate.criterion.CriteriaSpecification

...

def list() {
    params.max = Math.min(params.max ? params.int('max') : 10, 100)
    def criteriaParams = [:]
    criteriaParams.putAll(params)
    def sortParam = criteriaParams.remove('sort')
    def orderParam = criteriaParams.remove('order')
    def issueList = Issue.createCriteria().list(criteriaParams) {
        createAlias('assignedTo', 'assignedTo', CriteriaSpecification.LEFT_JOIN)
        if (sortParam) {
            order(sortParam, orderParam)
        }
    }

    [issueInstanceList: issueList, issueInstanceTotal: issueList.getTotalCount()]
}

Передача params в критерий list() метод автоматически обрабатывает разбиение на страницы и сортировку, точно так же, как метод list() объекта домена. Наш createAlias случается слишком поздно, поэтому мы должны удалить sort и order, а затем повторно применить их вручную после создания псевдонима, вызывающего левое соединение.

0 голосов
/ 09 ноября 2011

Как я понял, g: sortableColumn не зависит от объекта бина (в данном случае класса User), но использует его свойства класса.

property="assignedTo.lastName"

всегда должно работать, потому что оно используется в выражениях запроса 'order by' и 'sort' запроса

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