Ограничения Грааля GORM-JPA всегда сортируют по алфавиту - PullRequest
0 голосов
/ 15 февраля 2011

В моем приложении 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 = имя, адрес = адрес, ...).

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

Спасибо!

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

1 Ответ

0 голосов
/ 15 февраля 2011

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

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

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

EDIT:

Например, после установки лесов у меня есть файл <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}
    }

}
...