Grails gorm' where'查询' lower()'和' in'操作者

时间:2016-01-18 00:25:43

标签: grails gorm grails-3.0

我有一个Domain类

class Hashtag {
    String tag
}

为什么

Hashtag.where { lower(tag) == "#london" }.list()

工作正常,但

Hashtag.where { lower(tag) in [ "#london", "#paris" ] }.list()

结果

org.springframework.dao.InvalidDataAccessResourceUsageException: Unsupported function [lower] defined in query for property [hashtag] with type [class java.lang.String]

如何正确编写此类查询?

谢谢!

3 个答案:

答案 0 :(得分:1)

我无法回答为什么在lower()使用in()时无效。我读了source,但我不太了解AST,无法理解它。

但是,要解决您的问题,您可以使用derived property来执行lower()

class Hashtag {
    String tag
    String loweredTag

    static mapping {
        loweredTag formula: 'lower(tag)'
    }
}

然后您可以在where查询中使用derived属性:

Hashtag.where { loweredTag in [ "#london", "#paris" ] }.list()

答案 1 :(得分:1)

回答我自己的问题,我找到了使用Criteria进行不区分大小写的比较的替代方法。这种方法的一个优点是cities中的值也可能是混合的情况。

def cities = ["#LONdon", "#PAris"]
Hashtag.createCriteria().list {
    or {
        cities.each { eq("tag", it, [ignoreCase: true])
    }
}

答案 2 :(得分:0)

我不确定它是否会按照您的需要运作。 但documentation表示您可以在下面的块中使用子查询:

Hashtag.where { lower(tag).of{} in [ "#london", "#paris" ] }.list()

请尝试一下,如果它不起作用,请告诉我。

希望它有所帮助!