这是一个新手问题 - 谢谢你的帮助。我想在我的域模型中将派生属性设置为小写。做了一些搜索(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
传递什么(除了在映射中使用公式)?任何帮助将不胜感激。
答案 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)'
并享受..