如何在 Grails/GORM 中将派生属性设置为小写?
Posted
技术标签:
【中文标题】如何在 Grails/GORM 中将派生属性设置为小写?【英文标题】:How to set a derived property to lower case in Grails/GORM? 【发布时间】:2013-11-23 07:19:24 【问题描述】:这是一个新手问题——感谢您的帮助。我想在我的域模型中将派生属性设置为小写。做了一些搜索(http://grails.org/doc/latest/guide/GORM.html#ormdsl 加上其他一些),我认为以下内容会起作用(注意:nameLowerCase formula: 'LOWER(NAME)'
)...
但是,当我这样做时......
新项目(名称:'A').save(failOnError:true) 新项目(名称:'c').save(failOnError:true) 新项目(名称:'B').save(刷新:真,failOnError:真) println Item.list().nameLowerCase我原以为它会打印[a, b, c]
(除了排序之外还转为小写),但它会打印[null, null, null]
,我不知道为什么。
我做错了什么?或者,有没有其他方法可以在我的域类本身中为nameLowerCase
实现小写,而不管为name
传递了什么(除了在映射中使用公式)?任何帮助将不胜感激。
【问题讨论】:
【参考方案1】:我认为在数据库中存储相同的数据是个坏主意。 最好这样做:
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)。
【讨论】:
谢谢@user2980104!我相信我理解你的观点,这很有道理。我喜欢这两个答案,@Abdullah 的答案告诉我如何做我想做的事,而你的答案告诉我一个更好的方法来做我想做的事。还要感谢您提供的“更多信息”链接,它强制执行您刚才所说的内容! 给了一些更多的想法。如果我走 Anjey 的路线,我将无法将 'unique: true' 约束指定为 'nameLowerCase'(或者,我可以吗?),这在我的情况下是必需的。但是,我可以限制“名称”是唯一的,但这会让像“新项目(名称:“A”)'和“新项目(名称:“a”)'这样的情况溜走(我不希望)。但是,如果我走 Abdullah 的路线,我可以轻松地将 'unique: true' 约束指定为 'nameLowerCase'。因此,鉴于我要求将“nameLowerCase”限制为唯一,阿卜杜拉的路线似乎更可取。如果我错了,请纠正我。 是的 - 你不能对 'nameLowerCase' 使用 'unique' 约束。在这种情况下,我建议您使用自定义约束验证器:名称空白:false,验证器: val, obj -> def user = User.findByNameLike(val) return !user || obj.id == user.id )
希望对您有所帮助。
感谢您的反馈,安杰。我花了很多时间尝试实现您在上面给出的自定义约束验证器,但无法让它工作(很可能是因为我对整个事情缺乏经验)。 Abdullah 的方法让我的运气更好。【参考方案2】:
添加这个
def beforeInsert()
nameLowerCase = name.toLowerCase()
def beforeUpdate()
nameLowerCase = name.toLowerCase()
并删除它
nameLowerCase formula: 'LOWER(NAME)'
然后享受..
【讨论】:
哇,谢谢你阿卜杜拉......你拯救了我的一天!我一直在努力完成这项工作。一个小问题......除了你的建议之外,我必须为约束中的'nameLowerCase'设置'nullable:true'而不是'blank:false',并且它按预期工作。非常感谢! 通过上述所有更改,我仍然在验证“nameLowerCase”的唯一性约束时遇到了一些问题(在集成测试期间)。我花了一段时间才发现我需要在“Item”域类中添加另一个方法,如下所示(与 Abdullah 的非常相似):def beforeValidate()nameLowerCase = name.toLowerCase()
。现在它起作用了!以上是关于如何在 Grails/GORM 中将派生属性设置为小写?的主要内容,如果未能解决你的问题,请参考以下文章
Grails + GORM:GORM 中默认的 equals() 实现是啥?