Ограничения Grails GORM-JPA всегда сортирует по алфавиту

В моем приложении Grails, в котором я использую GORM-JPA, я не могу определить порядок элементов класса с помощью ограничений. Если я автоматически генерирую представления, все они сортируются в алфавитном порядке, а не в определенном порядке. Вот мой исходный класс:

package kbdw



import javax.persistence.*;
// import com.google.appengine.api.datastore.Key;

@Entity
class Organisatie implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    Long id

    @Basic
    String naam

    @Basic
    String telefoonnummer

    @Basic
    String email

    @Basic
    OrganisatieType type

    @Basic
    String adresLijnEen

    @Basic
    String adresLijnTwee

    @Basic
    String gemeente

    @Basic
    String postcode

    @Basic
    String faxnummer



    static constraints = {
        id visible:false
        naam size: 3..75
        telefoonnummer size: 4..18
        email email:true
        type blank:false
        adresLijnEen size:5..250
        adresLijnTwee blank:true
        gemeente size: 2..100
        postcode size: 4..10
        faxnummer size: 4..18
    }
}

enum OrganisatieType {
    School,
    NonProfit,
    Bedrijf
}

Имена переменных указаны на голландском языке, но они должны быть понятными (Organisatie = организация, naam = имя, adres = адрес, ...).

Как заставить приложение использовать этот порядок свойств? Нужно ли использовать аннотации @?

Спасибо!

Иван (ps: это для развертывания в Google App Engine ;-))


person friedkiwi    schedule 15.02.2011    source источник


Ответы (1)


Попробуйте установить и взломать скаффолдинг, а также использовать DomainClassPropertyComparator в своих гсп-с. Шаблоны скаффолдов используют компаратор Collections.sort() по умолчанию, но вы можете использовать явный компаратор.

Причиной может быть отсутствие Hibernate: без него DomainClassPropertyComparator не будет работать, а Grails использует SimpleDomainClassPropertyComparator — я смотрю DefaultGrailsTemplateGenerator.groovy

Вы можете, конечно, предоставить еще один Comparator, который будет сравнивать порядок объявленных полей.

ИЗМЕНИТЬ:

Например, после установки scaffolding у меня есть файл <project root>\src\templates\scaffolding\edit.gsp. Внутри такие строчки:

props = domainClass.properties.findAll{ ... }
Collections.sort(props, comparator. ... )

где comparator — это переменная, предоставляемая каркасом Grails. Ты можешь сделать:

props = ...
Collections.sort(props, new PropComparator(domainClass.clazz}))

где PropComparator что-то вроде

class PropComparator implements Comparator {
    private Class clazz
    PropComparator(Class clazz) { this.clazz = clazz }

    int compare(Object o1, Object o2) {
        clazz.declaredFields.findIndexOf{it.name == o1} 
          - clazz.declaredFields.findIndexOf{it.name == o2}
    }

}
person Victor Sergienko    schedule 15.02.2011
comment
Как я могу это сделать, добавив Comparator? Не могли бы вы привести пример? - person friedkiwi; 15.02.2011