我想在JPA中执行此查询。但是我在执行此查询时遇到错误。如何在JPA中使用Month(),Year() 我们可以在本机SQL Query中使用它们。但是如何使用它? 请帮帮我。谢谢!
select model from IptExchangeratelines model where model.iptExchangerate.id=:id and " +
" month(model.currencyExchangeDate)=:month and year(model.currencyExchangeDate)=:year
答案 0 :(得分:11)
很少有JPA实现内置对日期/时间函数的支持。
<强>的EclipseLink 强>
EclipseLink支持EXTRACT,允许任何数据库支持的日期/时间部分值 从日期/时间中提取。 EXTRACT函数与数据库无关,但需要数据库支持。
EXTRACT(YEAR, model.currencyExchangeDate)
,但它需要EclipseLink 2.4.x
FUNC 允许从JPQL调用数据库函数。它允许调用JPQL中不直接支持的任何数据库函数。
要调用数据库函数MyFunc(a, b, c)
,请使用FUNC('MyFunc', a, b, c)
。
您可以尝试FUNC('YEAR', currencyExchangeDate)
来调用'年'功能。
<强>休眠强>
在HQL中,您可以使用日期函数YEAR(date)
,MONTH(date)
,DAY(date)
来提取所需的详细信息。
支持的其他时间函数包括HOUR(date)
,MINUTE(date)
,SECOND(date)
。
标准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)));
答案 1 :(得分:1)
DataNucleus JPA jhas支持YEAR,MONTH,DAY,HOUR,MINUTE,SECOND,以及JPA 2.1标准&#34; FUNCTION&#34;用于在RDBMS中调用本机函数。
根据我的经验,所有JPA实现都支持这样的事情,这与其他答案给出的印象不同
答案 2 :(得分:0)
亲爱的
有时候我们不得不以不同的方式思考,也许这可以有所帮助:
TypedQuery<Number> query = entityManager.createQuery(
"SELECT SUM(COALESCE(p.amount, 0)) FROM Payment p WHERE p.paymentDate BETWEEN ?1 AND ?2", Number.class);
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.MILLISECOND, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.HOUR, 0);
calendar.set(Calendar.DAY_OF_MONTH, 1);
calendar.set(Calendar.MONTH, month -1);
calendar.set(Calendar.YEAR, year);
query.setParameter(1, calendar.getTime());
//the location is very important
calendar.add(Calendar.MONTH, 1);
calendar.add(Calendar.MILLISECOND, -1);
query.setParameter(2, calendar.getTime());
return query.getSingleResult().doubleValue();