【发布时间】:2015-06-25 18:12:20
【问题描述】:
我无法在 JPA 中仅选择月份或年份
在mysql中我写语句如下:
select * from table where Month(date) = 12 ;
在实体 bean 中我写如下:
select t from table t where Month(t.date) = 12;
但它会抛出错误!
PS:抱歉,我不在家,所以无法附加我的堆栈跟踪:D
【问题讨论】:
我无法在 JPA 中仅选择月份或年份
在mysql中我写语句如下:
select * from table where Month(date) = 12 ;
在实体 bean 中我写如下:
select t from table t where Month(t.date) = 12;
但它会抛出错误!
PS:抱歉,我不在家,所以无法附加我的堆栈跟踪:D
【问题讨论】:
抱歉,据我所知,您无法使用 JPA 执行此操作。另一边的hibernate的hql知道诸如month() hour()和minute()之类的东西。
检查这个问题:JPA Date Arithmetic?
希望有所帮助
【讨论】:
不是 JPA 的一部分,因此是供应商扩展的角色。大多数 JPA 实现都支持它......而且你没有说你正在使用哪一个。 DataNucleus 当然支持 MONTH、YEAR、DAY、HOUR、MINUTE、SECOND。
【讨论】:
这可能对某人有所帮助。
很少有 JPA 实现具有对日期/时间函数的内置支持。
EclipseLink
EclipseLink 支持 EXTRACT,允许任何数据库支持的日期/时间 要从日期/时间中提取的部分值。提取函数是 独立于数据库,但需要数据库支持。摘录(年, model.currencyExchangeDate),但它需要 EclipseLink 2.4.x
FUNC 允许从 JPQL 调用数据库函数。它允许调用 JPQL 中不直接支持的任何数据库函数。 要调用 DB 函数 MyFunc(a, b, c),请使用 FUNC('MyFunc', a, b, c)。
您可以尝试 FUNC('YEAR', currencyExchangeDate) 来调用 'YEAR' 功能。
休眠
在HQL中,可以有日期函数YEAR(date), MONTH(date), DAY(date) 提取所需的详细信息。支持的其他时间功能是 HOUR(日期),MINUTE(日期),SECOND(日期)。
标准 API
CriteriaBuilder#function() : 为执行创建一个表达式 数据库函数。
CriteriaQuery<IptExchangeratelines> cq = cb.createQuery(IptExchangeratelines.class);
Root<IptExchangeratelines> exRateLine = cq.from(IptExchangeratelines.class);
cq.where(cb.equal(cb.function("year", Integer.class,
exRateLine.get(exRateLine_.currencyExchangeDate)), year)
.and(cb.equal(cb.function("month", Integer.class,
exRateLine.get(exRateLine_.currencyExchangeDate)), month)));
【讨论】: