2015-10-08 2 views
0

Я пытаюсь сделать заказ на перечисление, но я получаю некоторые ошибки в том, что ...Как заказать по перечислению на grails?

это код, я использую:

and { 
     invoiceTicketDetail { 
     order('date', 'asc') 
     order('code', 'asc') 
     } 
} 
lineType { 
    order('sortOrder', 'asc') 
} 

типов линий является Enum и есть атрибут ИНТ с именем SortOrder, чтобы заказать LineType правильно .. проблема заключается в том, что я получаю следующее сообщение об ошибке при попытке выполнить это

No signature of method: InvoiceService.lineType() is applicable for argument types: (InvoiceService$_tt__getInvoiceDetailList_closure36_closure57) values: [[email protected]c8544] 
Possible solutions: asType(java.lang.Class), asType(java.lang.Class). Stacktrace follows: 
groovy.lang.MissingMethodException: No signature of method: InvoiceService.lineType() is applicable for argument types: (InvoiceService$_tt__getInvoiceDetailList_closure36_closure57) values: [[email protected]c8544] 
Possible solutions: asType(java.lang.Class), asType(java.lang.Class) 
    at InvoiceService$_$tt__getInvoiceDetailList_closure36$$EPQTbhPk.doCall(InvoiceService.groovy:477) 

InvoiceService это услуга, я использую, но это не так основной объект. Если я просто удалю строки lineType, он отлично работает, но мне нужно добавить этот тип линии в этом порядке.

Есть ли другой способ сортировки по сложному объекту нескольких столбцов?

ответ

0

Вы не можете сортировать по lineType.sortOrder, так как GORM/Hibernate сортируется по свойству domain/entity. Он становится столбцом базы данных, но вы не можете указать столбец базы данных с sort(). lineType - свойство домена, но lineType.sortOrder нет, (это свойство enum). Сортировка по lineType будет сортироваться по порядковому значению перечисления. Это то, что вы увидите в базе данных.

Сортировать по SQLProjection

Самый сложный путь (намек, вероятно, не стоит), чтобы создать Hibernate User Type для перечисления, так что вы можете хранить сортировочный значение в отдельном столбце базы данных. С таким столбцом вы можете использовать SQLProjection для динамического создания свойства и сортировки по нему. Одна из сторон этого подхода заключается в том, что вы не сможете возвращать экземпляры корневого объекта (например, SomeDomain в SomeDomain.withCriteria()). Вместо этого вы можете вернуть идентификатор экземпляра:

def ids = DomainClass.withCriteria { 
    and { 
      invoiceTicketDetail { 
      order('date', 'asc') 
      order('code', 'asc') 
      } 
    } 

    projections { 
     property('id') 
     sqlProjection 'the_added_column as sortOrder', 'sortOrder', org.hibernate.type.IntegerType as org.hibernate.type.Type 
    } 

    sort('sortOrder') 
} 

Добавить новый домен свойство

Вы можете добавить новое свойство непосредственно к классу домена (бывший SortOrder.).

Groovy

Вы можете отсортировать на клиентской стороне в Groovy.

+0

Эммануэль Роза, я не мог понять первый подход ... Я пробовал третий, но не работал ... Второй для меня невозможен ... модель окажется не в порядке потому что sortOrder не является частью решения этой проблемы ... Кажется, что первый из них - лучший способ сделать это ... но я не мог понять, что я должен использовать, когда вы добавляете «the_added_column as sortOrder». – Igor

+0

Сначала вам нужно создать тип пользователя Hibernate для соответствия перечислению lineType. Затем в Grails вы можете сопоставить столбцы таблицы с типом линии: тот, который у вас уже есть для порядкового номера, и новый для порядка сортировки. Затем вы можете использовать новый столбец в sqlprojection (например, the_added_column). В основном sqlprojection динамически создает свойство из добавленного столбца, чтобы вы могли сортировать его. https://grails.github.io/grails-doc/latest/guide/GORM.html#customHibernateTypes –