grails criteria :How to select mysql 中的所有列并同时格式化日期然后使用 like

grails criteria :How to select all columns in mysql and at the same time format the date then use like

我目前正在为我的页面创建搜索功能。数据将来自数据库。

在 HTML 中,日期以这种格式显示 dd/mm/yyyy。我想要做的是,在 select 查询中,我想 select 所有列和日期应该使用该格式显示,我有几个类似的条件将用于检查如果有匹配项。

我将如何 select 所有列、格式日期并同时使用条件中的一个语句检查所有匹配项?

这是我到目前为止所做的,但这是错误的。

 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;     

我建议的第一件事是注释掉除一个之外的所有喜欢。选择任何一个。关键是要专注于让其中一个发挥作用。然后,只有这样,再添加一个喜欢.

其次,确认您使用的模式(例如 %SEARCHSTRING%)对您使用的数据库的 LIKE 运算符有效。

第三,一旦您开始使用它,您就会发现很遗憾,它不会像您希望的那样工作。例如,多词搜索不适用于您的方法。搜索很难。我让它工作得很好,但是男孩很痛苦。如果你想把它做好,最好让专业人士来处理,比如使用 Apache Lucene.

匹配日期

也就是说,处理日期的最佳方法是将其转换为 Date 对象并与之匹配。你可以使用这样的东西:

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)
}

提示

您可以使用GStrings:

以更简洁的形式重写您的喜欢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