查询中的Grails lower()不起作用

时间:2013-05-14 12:54:35

标签: grails lowercase

假设我有这样的代码:

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

3 个答案:

答案 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%' ...")