如何在JPA中仅选择月份

时间:2010-12-12 14:32:34

标签: jpa ejb-3.0

我在JPA中仅选择月份或年份时遇到问题

在mysql中我写的语句如下:

select * from table where Month(date) = 12 ;

并在实体bean中写下如下:

select t from table t where Month(t.date) = 12;

但它会抛出错误!!

PS:对不起我无法附上我的堆栈跟踪,因为我不在家:D

3 个答案:

答案 0 :(得分:1)

抱歉,据我所知,你不能用JPA这样做。另一方面,hibernate hql知道诸如month()hour()和minute()之类的内容。

检查此问题:JPA Date Arithmetic?

希望有所帮助

答案 1 :(得分:0)

不属于JPA,因此也属于供应商扩展的角色。大多数JPA实现都支持它...而且你没有说你正在使用哪一个。 DataNucleus肯定支持MONTH,YEAR,DAY,HOUR,MINUTE,SECOND。

答案 2 :(得分:0)

这可能有助于某人。

很少有JPA实现内置对日期/时间函数的支持。

<强>的EclipseLink

  

EclipseLink支持EXTRACT,允许任何数据库支持的日期/时间   从日期/时间中提取的部分值。 EXTRACT功能是   数据库独立,但需要数据库支持。 EXTRACT(YEAR,   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(日期),MONTH(日期),DAY(日期)   提取所需的细节。支持的其他时间功能是   小时(日期),分钟(日期),第二天(日期)。

标准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)));