【问题标题】:Grails & Hibernate createCriteria igorning intermediary white space in like clauseGrails & Hibernate createCriteria igorning intermediary white space in like 子句
【发布时间】:2016-03-27 07:07:20
【问题描述】:

Grails 版本:3.0.7

Groovy 版本:2.4.4

JVM 版本:1.8.0_51

我在 grails 服务中有以下查询,我的问题是如何“忽略”字段值(如邮政编码)中间的空白。

例如,期望的结果是“LL551RB”将匹配数据库中保存的“LL55 1RB”的like 子句。相反,解决方案很简单,从查询值中去除空格,但我无法确定如何从数据库值中去除空格。

我尝试了以下变体,虽然它们执行时不正确匹配。

    def allRecordsMatched = Event.createCriteria().listDistinct {

        or {
            eventCategories {
                like("categoryName", "%" + search + "%")
            }
            like("eventName", "%" + search + "%")
            like("address.town", "%" + search + "%")
            like("address.county", "%" + search + "%")
            like("address.postalCode".replaceAll("\\s",""), "%" + search + "%")
        }
        order("startDateTime", "asc")
    }

    return [results, allRecordsMatched]

【问题讨论】:

  • 您可以在 hql 中重写它并在其中使用 TRIM(FIELD) 函数(不确定它在 hql 中是否有效,但在 sql 中有效。
  • 您应该在保存邮政编码之前或通过后台作业去除不需要的空格。所有其他方法都会导致查询更复杂,搜索性能更差
  • @injecteer 好点。我已经删除了数据库中现有条目中的空格,并在域类上实现了一个设置器来删除任何空格并将字母转换为大写。

标签: hibernate grails grails-orm grails-3.0


【解决方案1】:

您可以使用sqlRestriction 替换列值中的所有空格,然后再将其与搜索参数匹配。例如:

address{
    Restrictions.sqlRestriction("REPLACE(postal_code, ' ', '') like %$search%")
}

【讨论】:

  • 感谢您的建议。尽管我已经寻求另一种解决方案,但我无法使上述方法正常工作。我应该把这个声明放在代码块的什么地方?
猜你喜欢
  • 1970-01-01
  • 2014-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 2012-03-30
  • 2019-06-13
相关资源
最近更新 更多