2015-12-21 107 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

感謝您的建議儘管我已經找到了另一種解決方案,但是我無法獲得上述解決方案,所以我應該將此聲明放在代碼塊中? –

相關問題