grails - 关于hasMany关系的自定义排序?

时间:2014-04-24 19:59:33

标签: grails gorm

我正在开展多语言Grails申请。

这是我实现多语言功能的一个示例:

语言域

class Language {
    String name
   .....
}


class Category { 
    static hasMany = [translations : CategoryTranslation]
    ....
}


class CategoryTranslation {

    String name
    String description

    Language lang
    static belongsTo = [category:Category]

}

所以类别有多个翻译,每种语言1个翻译,我想按名称排序类别,但名称是CategoryTranslation域的属性

在hasMany关系上实现排序的最佳方法是什么?


编辑:

问题是我对每个类别都有多个翻译,例如,

cat1 - >有3个翻译(阿拉伯语,英语和法语)

cat2 - >有3个翻译(阿拉伯语,英语和法语)

cat3 - >有3个翻译(阿拉伯语,英语和法语)

def categoriesSortedByArabicName = Category.list(sort: "arabicName");
def categoriesSortedByEnglishName = Category.list(sort: "englishName"); 

首先我想使用,每种语言的瞬态属性,但这种方法不适用于排序,因为Hibernate将请求转换为数据库处理,而数据库根本不知道字段是什么" arabicName& #34;无论如何。

现在我将尝试使用静态映射中的公式添加瞬态属性

1 个答案:

答案 0 :(得分:1)

默认情况下,关联为Set。您必须使用SortedSet维护订单:

import java.util.SortedSet

class Category { 
    SortedSet translations
    static hasMany = [translations : CategoryTranslation]
}

//implement Comparable
class CategoryTranslation implements Comparable {
    String name
    String description
    Language lang

    static belongsTo = [category:Category]

    int compareTo(obj) {
        obj.name <=> this.name
    }
}

使用Grails 2.4(最新里程碑),您可以获得Groovy 2.3.0-SNAPSHOT,您可以在CategoryTranslation使用@Sortable AST转换,如下所示:

import groovy.transform.Sortable

@Sortable(includes='name')
class CategoryTranslation {
    String name
    String description
    Language lang

    static belongsTo = [category:Category]
}