0

可以说,我有一个带有“availableOn”字段的“Book”类(如下所示)。

class Book {
    String availableOn;
}

字段保存值

  • “全天”或
  • 日期的字符串表示形式。例如“13/06/2012”

我怎样才能获得未来两天内可用的所有书籍?下面的代码会抛出异常(“java.util.Date 不能转换为 java.lang.String”)

def books = c.list(){
    between('availableOn', new Date(), new Date() + 2)
}

PS:我正在研究一个遗留数据库,所以我不打算改变架构:(

4

3 回答 3

1

我认为该between声明将存在两个问题:

  • availableOn当其Date值为All days
  • 即使availableOn其中有日期值,也不会转换为 aDate进行比较

我会尝试这样的事情:

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
}

显然,这可以以更好的方式完成(例如,向域类添加一些方法),但这应该说明我的想法......

于 2013-07-11T10:24:26.013 回答
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])

我的解决方案的问题是这个查询变得依赖于数据库。to_date是一个 Oracle 函数。您可能需要更改它以适合您的数据库

于 2013-07-11T10:58:12.633 回答
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 db,则可以执行以下操作:

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'
    }
}
于 2013-07-11T10:20:41.250 回答