如何在Grails / GORM中将派生属性设置为小写?

时间:2013-11-11 13:08:40

标签: sql grails gorm

这是一个新手问题 - 谢谢你的帮助。我想在我的域模型中将派生属性设置为小写。做了一些搜索(http://grails.org/doc/latest/guide/GORM.html#ormdsl加上其他一些),我认为以下内容可行(注意:nameLowerCase formula: 'LOWER(NAME)')...

class Item {
    String name
    String nameLowerCase

    static constraints = {
        name(blank: false)
        nameLowerCase(blank: false, unique: true)
    }

    static mapping = {
        nameLowerCase formula: 'LOWER(NAME)'
        sort nameLowerCase: "asc"
    }
}

然而,当我这样做的时候......

new Item(name: 'A').save(failOnError: true)
new Item(name: 'c').save(failOnError: true)
new Item(name: 'B').save(flush: true, failOnError: true)

println Item.list().nameLowerCase

我原本期望它打印[a, b, c](除了排序之外转向小写),但它打印[null, null, null],我无法找出原因。

我做错了什么?或者,有没有其他方法可以在我的域类本身中为nameLowerCase实现小写,而不管为name传递什么(除了在映射中使用公式)?任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:3)

我认为在数据库中存储相同的数据是个坏主意。 最好这样做:

class Item {
    static transients = ['nameLoweCase']
    String name

    String getNameLowerCase(){
       name.toLowerCase() 
    }

    static constraints = {
       name blank: false
    }
}

在控制器中:

class SomeController{
     def show(Long id){
        def item = Item.get(id)
        item.nameLowerCase // name in lower case
     }
}

'transient'定义了不应该持久保存到数据库的属性名称列表(more about it)。

答案 1 :(得分:2)

只需添加此

即可
def beforeInsert() {
    nameLowerCase = name.toLowerCase()
}

def beforeUpdate() {
    nameLowerCase = name.toLowerCase()
}

并删除此

nameLowerCase formula: 'LOWER(NAME)'

并享受..