grails - grails标准:如何选择mysql中的所有列并同时格式化日期,然后使用like

标签 grails hibernate-criteria

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

在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;     

最佳答案

我建议的第一件事是注释掉所有喜欢的人,除了一个。选择任何一个。重点是只让其中之一工作。然后,直到那时,再添加一个ilike。

其次,确认您使用的模式(例如%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)
}

小费

您可以使用GString,以更简洁的形式重写自己的喜欢:
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

关于grails - grails标准:如何选择mysql中的所有列并同时格式化日期,然后使用like,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32062449/

相关文章:

grails - 试用neo4j grails插件,但与文档不匹配

hibernate - 将 Grails + Hibernate 应用扩展到单台机器之外

Java Hibernate 标准多对一

java - 使用 IN 运算符在多对多关系中进行 JPA 条件查询

java - 如何使用子查询.in

java - 如何实现基于条件的多字段搜索

grails - 访问 grails shiro 插件中的特定 Controller

grails - grails 应用程序中基于租户的唯一用户名

grails - 在同一测试中创建graphGraphbaseService时找不到节点

grails - 搜索具有逗号分隔值的记录,其中包含给定列表中的任何元素