查询中的Grails lower()不工作

查询中的Grails lower()不工作,grails,lowercase,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

假设我有这样的代码:

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")
}
static mapping = {
   lowerFirstName formula: "lower(holder_first_name)"
我想使用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")
}

我的代码不起作用。正确的语法是什么?我对umlauts有问题,所以我不想使用ilike

如果您试图比较大小写不敏感,另一个选择是使用ilike。Ilike与Like类似,但不区分大小写

如果您不想使用ilike(如问题中所添加的),我认为您可以选择executeQuery和hql

Account.executeQuery(" select * from Account where .... or (lower(holderFirstName) = 'Fred%' ...")

不知道您希望使用哪个
lower
函数,但我猜您希望基于
holderFirstName
属性获取数据,忽略大小写

在这里,您可以使用
ilike
,这是一种不区分大小写的
,类似于

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()

更新

您可以尝试向域类添加
公式,如下所示:

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")
}
static mapping = {
   lowerFirstName formula: "lower(holder_first_name)"
}

并将条件中的属性更改为
lowerFirstName

like("lowerFirstName", "fred%") // changed 'Fred%' to 'fred%' 

代码没有经过测试,但应该可以工作。

要在标准中使用数据库函数,需要使用直接向生成的sql添加限制的sqlRestriction()

def c = Account.createCriteria()
def results = c.list {
...
  sqlRestriction("lower(holder_first_name) like '%%'")
}

请注意,您使用的是列名,而不是属性名。

umlauts和ilike有什么问题吗?我不能以某种方式使用我的默认条件吗。我不明白这只是一个函数调用,它不起作用。我不知道如何在createCriteria中实现它,除了我喜欢的,也许其他人有更好的解决方案。这工作很好,正是我想要的。但是我还有一个问题,如果第一个字母是德语umlaut,则找不到结果,尽管记录是数据库,但您还需要在实体类中添加lowerFirstName。