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
我目前正在为我的页面创建搜索功能。数据将来自数据库。
在 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:
以更简洁的形式重写您的喜欢silike("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