假设我有这样的代码:
def c = Account.createCriteria()
def results = c {
between("balance", 500, 1000)
eq("branch", "London")
or {
like("holderFirstName", "Fred%")
like("holderFirstName", "Barney%")
}
maxResults(10)
order("holderLastName", "desc")
}
我想使用lower()函数将数据转换为小写
def c = Account.createCriteria()
def results = c {
between("balance", 500, 1000)
eq("branch", "London")
or {
like("lower(holderFirstName)", "Fred%")
like("lower(holderFirstName)", "Barney%")
}
maxResults(10)
order("holderLastName", "desc")
}
我的代码不起作用。什么是正确的语法?我的变音符号有问题所以我不想使用ilike
答案 0 :(得分:3)
不知道您要使用哪个lower
函数,但我想您想要根据holderFirstName
属性获取数据,忽略大小写。
在这里,您可以使用ilike
,这是一个不区分大小写的like
:
def c = Account.createCriteria()
def results = c.list {
between("balance", 500, 1000)
eq("branch", "London")
or {
ilike("holderFirstName", "Fred%")
ilike("holderFirstName", "Barney%")
}
maxResults(10)
order("holderLastName", "desc")
}
顺便说一句 - 您错过了根据您的标准致电list()
...
<强>更新强>
您可以尝试向您的域类添加formula
,如下所示:
static mapping = {
lowerFirstName formula: "lower(holder_first_name)"
}
并将条件中的属性更改为lowerFirstName
:
like("lowerFirstName", "fred%") // changed 'Fred%' to 'fred%'
代码未经过测试但应该有效。
答案 1 :(得分:2)
要在条件中使用数据库函数,您需要使用sqlRestriction()
直接向生成的sql添加限制。
def c = Account.createCriteria()
def results = c.list {
...
sqlRestriction("lower(holder_first_name) like '%%'")
}
请注意,使用您的列名称而不是属性名称。
答案 2 :(得分:1)
如果您正在尝试比较不区分大小写,则另一种选择是使用ilike来实现此目的。 Ilike与Like类似,但它不区分大小写。 here
如果您不想使用ilike(添加到问题中),我认为您的替代方法是executeQuery和hql。
Account.executeQuery(" select * from Account where .... or (lower(holderFirstName) = 'Fred%' ...")