2

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

类项目{
    字符串名称
    字符串名称小写

    静态约束 = {
        名称(空白:假)
        nameLowerCase(空白:假,唯一:真)
    }

    静态映射 = {
        nameLowerCase 公式:'LOWER(NAME)'
        排序名称小写:“asc”
    }
}

然而,当我这样做...

新项目(名称:'A').save(failOnError:true)
新项目(名称:'c').save(failOnError:true)
新项目(名称:'B').save(刷新:真,failOnError:真)

println Item.list().nameLowerCase

我原以为它会打印[a, b, c](除了排序之外还变成小写),但它会打印[null, null, null],我不知道为什么。

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

4

2 回答 2

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' 定义了一个属性名列表,这些属性名不应该被持久化到数据库中(更多关于它)。

于 2013-11-11T18:19:44.383 回答
2

只需添加这个

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

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

并删除这个

nameLowerCase formula: 'LOWER(NAME)'

享受..

于 2013-11-11T13:52:38.207 回答