【发布时间】:2011-09-09 18:51:30
【问题描述】:
如果我期待一个 Date 对象,比如说 2011-03-05
我想在 2011-03 年使用 HQL 拉取所有内容,忽略该天/05
类似于 where year(somecolumn) = year(datepassedin) and month(somecolumn) = month(datepassedin)
可以用 HQL 做吗?
在 SQL 中似乎很容易做到,但在 HQL 中却不是
【问题讨论】:
如果我期待一个 Date 对象,比如说 2011-03-05
我想在 2011-03 年使用 HQL 拉取所有内容,忽略该天/05
类似于 where year(somecolumn) = year(datepassedin) and month(somecolumn) = month(datepassedin)
可以用 HQL 做吗?
在 SQL 中似乎很容易做到,但在 HQL 中却不是
【问题讨论】:
HQL 有年份和月份expressions,你可以给它提供日期对象就好了。所以,像往常一样使用Query 对象,没有什么花哨或复杂的。
【讨论】:
我尝试了同一个查询的两个不同版本,在 SQL Server 中,像 where year(somecolumn) 这样的查询比括号查询慢得多(几乎一个数量级)。
您必须创建两个日期,一个在范围的开头,一个在结尾。假设你有一个字符串:
val data = "2011-03-05"
在某个地方创建一个方便的 const 来解析值:
val dateFormat: SimpleDateFormat = new SimpleDateFormat("yyyy-MM")
然后:
val yearMonthString = data.substring(0, 7)
val fromValue = dateFormat.parse(yearMonthString)
val c: Calendar = Calendar.getInstance(iPutATimeZoneHere)
c.setTime(fromValue)
c.add(Calendar.MONTH, 1)
val toValue = c.getTime
在您的查询中,您将拥有where somecolumn >= :fromValue and somecolumn < :toValue。
这段代码是用 Scala 编写的,但它使用标准 Java 库。
【讨论】: