2015-08-18 41 views
0

我正在爲我的頁面創建搜索功能。數據將來自數據庫。grails標準:如何選擇mysql中的所有列,並同時格式化日期然後像

在HTML中,日期以這種格式顯示dd/mm/yyyy。我想要做的是在選擇查詢中,我想選擇所有列,並且應該使用該格式顯示日期,並且我有一些類似的條件將用於檢查是否匹配。

如何將選擇所有列,格式日期和所有同時檢查匹配使用一個單獨的語句中的標準?

這是我迄今爲止所做的,但這是錯誤的。

searchString = searchString.toLowerCase() 

     def employeeSearchCri = Employee.createCriteria(); 
     def searchedEmployeeList = employeeSearchCri.list(){ 
      or { 
       ilike("employeeNo", "%" + searchString + "%") 
       ilike("firstName", "%" + searchString + "%") 
       ilike("lastName", "%" + searchString + "%") 
       ilike("middleName", "%" + searchString + "%") 
       ilike("jobPosition", "%" + searchString + "%") 
       ilike("date_format(hireDate, '%d/%m/%Y')", "%" + searchString + "%") 
       ilike("status", "%" + searchString + "%") 
      } 
      and{ 
       eq("companyId",companyId) 
      } 
     } 
     return searchedEmployeeList;  

回答

1

我推薦的第一件事是註釋掉所有ILIKE S的除了一個。選擇任何一個。重點在於讓他們中的一個人工作。然後,只有這樣,才能添加另一個ilike

其次,確認模式,將使用(例如:%搜索字符串%)的有效期爲您的使用數據庫的LIKE操作。

第三,一旦你得到它的工作,你會學到,不幸的是它不會工作,以及你想。例如,多詞搜索不適用於您的方法。搜索很難。我工作得很好,但男孩真的很痛苦。如果你想讓它正確完成,最好讓專業人員處理它,比如使用Apache Lucene

匹配日期

也就是說,處理日期的最佳方法是將其轉換成日期對象和匹配上。通過使用GString小號

import java.text.SimpleDateFormat 

def searchDate 

try { 
    searchDate = new SimpleDateFormat('dd/MM/yyyy').parse(searchString) 
} catch (java.text.ParseException e) { } 

... 

or { 
    ... 
    if(searchDate) eq("hireDate", searchDate) 
} 

提示

您可以在一個更簡潔的形式重新寫你的ILIKE S::您可以使用這樣的事情

ilike("employeeNo", "%$searchString%") 

如果你打造您想要使用的列的列表ilike,您可以簡化您的查詢。這裏有一個完整的例子:

searchString = searchString.toLowerCase() 

def columns = [ 
    "employeeNo", 
    "firstName", 
    "lastName", 
    "middleName", 
    "jobPosition", 
    "status" 
] 

def searchDate 

try { 
    searchDate = new java.text.SimpleDateFormat('dd/MM/yyyy').parse(searchString) 
} catch (java.text.ParseException e) { } 

def employeeSearchCri = Employee.createCriteria(); 
def searchedEmployeeList = employeeSearchCri.list() { 
    or { 
     columns.each { ilike(it, "%$searchString%") }   
     if(searchDate) eq("hireDate", searchDate) 
    } 

    and{ 
     eq("companyId",companyId) 
    } 
} 

return searchedEmployeeList 
+0

首先感謝你的所有提示,這真的很有幫助。我有一個問題,假設我有這個** searchString「/ 2015」**在你的例子中,這將不匹配hireDate列的權利?請問在Grails中是否有可能這樣做?我試着用這個sqlRestriction(「cast(date_format(hire_date,'%d /%m /%Y')AS CHAR)」),我也有一個類似的聲明在底部,但我得到這個「java.lang .String不能轉換爲java.util.Date「。謝謝:) – user3714598

+0

正確。沒有辦法將'/ 2015'變成日期。但是,如果您想出一個用於指定日期部分的搜索語法,例如'year:2015',則可以在條件中使用它。例如:一年(「hireDate」,searchYear)。所以基本上你需要一些邏輯來確定你的搜索類型(例如純文本,僱用日期,僱傭月份,僱傭日,僱傭年)並從那裏繼續。您可以在條件中使用函數year(),month()和day()。請參閱https://grails.github.io/grails-doc/latest/guide/GORM.html#detachedCriteria –

相關問題