【问题标题】:Grails gorm 'where' query with 'lower()' and 'in' operator使用“lower()”和“in”运算符的 Grails gorm 'where' 查询
【发布时间】:2016-04-23 01:57:47
【问题描述】:

我有一个域类

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]

如何正确编写这样的查询?

谢谢!

【问题讨论】:

  • 我有类似的代码使用 lower() 方法,并注意到它的工作方式不一致。当它不起作用时,解决方法是将war文件重新部署到tomcat实例。相反,我将在下面使用您的 createCriteria() 方法来查看它是否更一致地工作。
  • 不能说一致性。我使用 lower() 方法,但我不关注它是如何工作的。

标签: grails grails-orm grails-3.0


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我无法回答为什么使用 lower()in() 不起作用。我阅读了source,但我对 AST 的了解不够深入,无法理解它。

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

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

    那么就可以在where查询中使用派生属性:

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

    【讨论】:

      【解决方案3】:

      我不确定它是否能满足您的需要。 但documentation 表示您可以在 where 块中使用子查询,如下所示:

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

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

      希望对你有帮助!

      【讨论】:

      • 不幸的是它不起作用,导致groovy.lang.MissingMethodException: No signature of method: grails.gorm.DetachedCriteria.lower() is applicable for argument types: (grails.gorm.DetachedCriteria) values: [grails.gorm.DetachedCriteria@3a76c384] Possible solutions: toSet(), or(groovy.lang.Closure), order(java.lang.String), count(), get(), list()
      猜你喜欢
      • 2014-09-23
      • 2011-06-03
      • 2015-01-30
      • 1970-01-01
      • 2014-05-05
      • 1970-01-01
      • 2012-05-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多