2015-12-21 54 views
0

Grails的版本:3.0.7的Grails和Hibernate个createCriteria igorning中介空白像条

Groovy的版本:2.4.4

JVM版本:1.8.0_51

我有以下查询中Grails服务和我的问题是如何在字段值(如邮编)中间忽略空白。

作为一个例子,期望的结果是'LL551RB'将在数据库中保存的'LL55 1RB'的类似条款中匹配。相反,解决方案很简单,可以从查询值中删除空白,但我无法确定如何从数据库值中删除它。

我试过下面哪些变体,虽然它们执行时不正确。

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] 
+0

可以在HQL和使用TRIM(FIELD)函数在它改写它(不要确定它在HQL工作,但在SQL它的工作 – Koloritnij

+2

您应该保存之前剥去不需要的空格。你的邮政编码或通过后台工作,所有其他方法会导致查询更加复杂,并导致更差的搜索性能 – injecteer

+0

@injecteer好点,我已经删除了DB中现有条目中的空白并实现了一个setter在域类中删除任何空格以及将字母转换为大写 –

回答

1

可以使用sqlRestriction与搜索参数匹配之前从列值更换所有的空格。例如:

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

感谢您的建议尽管我已经找到了另一种解决方案,但是我无法获得上述解决方案,所以我应该将此声明放在代码块中? –