让我们说,我有一个“Book”类,其字段为“availableOn”(如下所示)。
class Book {
String availableOn;
}
字段包含值
我怎样才能获得未来两天内可用的所有图书?下面的代码会引发异常(“java.util.Date不能转换为java.lang.String”)
def books = c.list(){
between('availableOn', new Date(), new Date() + 2)
}
PS:我正在处理遗留数据库,因此不应该更改架构:(
答案 0 :(得分:1)
我认为between
陈述会有两个问题:
availableOn
的值为Date
All days
进行比较
availableOn
中包含日期值,也不会将其转换为Date
进行比较我会尝试这样做:
def now = new Date()
def books = Book.findAllByAvailableNotEqual("All days").findAll { book ->
Date.parse('dd/MM/yyyy', book.availableOn) > now && Date.parse('dd/MM/yyyy', book.availableOn) < now+2
}
显然,这可以通过更好的方式完成(例如,向域类添加一些方法),但这应该说明我的想法......
答案 1 :(得分:0)
您可以在日期上使用format
来获取所需的字符串格式。
new Date().format('dd/MM/yyyy')
您的标准将被修改为
def books = c.list(){
def todayDateStr = new Date().format('dd/MM/yyyy')
def twoDaysAfterTodayDateStr = (new Date()+2).format('dd/MM/yyyy')
or{
between('availableOn', todayDateStr, twoDaysAfterTodayDateStr)
eq 'availableOn', 'All Days'
}
}
测试str比较是否有效,否则必须使用其他方法。从电话发送,原谅我的错别字。
<强>更新强>
当日期类似于“01/01/2013”和“07/11/2011”时,上述情况会在特殊情况下失败。
或者,您可以使用sqlRestriction
,但在这种情况下,它会与底层数据库紧密耦合。如果使用Oracle数据库,可以执行以下操作:
def books = c.list(){
def todayDateStr = new Date().format('dd/MM/yyyy')
def twoDaysAfterTodayDateStr = (new Date()+2).format('dd/MM/yyyy')
or{
sqlRestriction "to_date(available_on, 'DD/MM/YYYY') between to_date(todayDateStr, 'DD/MM/YYYY') and to_date(twoDaysAfterTodayDateStr, 'DD/MM/YYYY')"
eq 'availableOn', 'All Days'
}
}
答案 2 :(得分:0)
我没有基于标准的解决方案,但你可以尝试这样的事情:
Book.executeQuery(
"select book from Book book where book.availableOn = :availableOn or to_date(book.availableOn, :format) between (:startDate, :endDate) ",
[availableOn:"All days", format: "dd/MM/yyyy", startDate: startDate, endDate:endDate])
我的解决方案的问题是此查询变得依赖于DB。 to_date
是Oracle函数。您可能希望更改此选项以适合您的数据库