我有一个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]
如何正确编写此类查询?
谢谢!
答案 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()
请尝试一下,如果它不起作用,请告诉我。
希望它有所帮助!