JPA查询MONTH / YEAR函数

如何像使用sql查询一样使用MONTH函数编写JPA查询?

 @NamedQuery(name="querybymonth", query="select t from table1 t where MONTH(c_Date) = 5") 

当我使用上面的模式进行查询时,我收到一个错误: unexpected token - MONTH

如果您使用的是EclipseLink(2.1),则可以使用FUNC()函数调用JPA JPQL规范中未定义的任何数据库函数。

即FUNC(’MONTH’,c_Date)

在JPA 2.1(EclipseLink 2.5)中, FUNCTION语法成为规范的一部分(并替换了EclipseLink特定的FUNC)。

如果您使用的是TopLink Essentials,则无法在JPQL中执行此操作,但可以为其定义TopLink Expression查询(类似于JPA 2.0条件),或使用本机SQL。

此外,如果您使用任何JPA 2.0提供程序并使用Criteria查询,则可以使用function()API来定义它。

我想查询YEAR(itemDate),但函数没有退出,然后我看到了SUBSTRING()函数,所以我所做的是Select q from table where SUBSTRING(itemDate, 1, 4)='2011' ,它适用于我! 希望能帮助到你!

如果你需要一个动态变量,你也可以这样做。 这里:poDate是在setParameter()中定义的年份;

 @NamedQuery(name = "PurchaseOrders.findByYear", query = "SELECT p FROM PurchaseOrders p WHERE SUBSTRING(p.poDate, 1, 4) = :poDate") Query q = em.createNamedQuery("PurchaseOrders.findByYear"); q.setParameter("poDate", s_year+""); 

但如果你对你的解决方案没问题,那就没事了。 我只是发现JPA执行得更快。

MONTH()函数存在于Hibernate HQL中,但不是标准的JPA函数。 也许你的JPA提供商有一些专有的等价物,但你没有提到它。 如果没有,请回退到本机SQL。


我正在使用Toplink Essentials。 如果Toplink中存在任何function,请提供帮助。 谢谢。

据我所知,TopLink没有直接的等价物。 因此要么使用本机SQL查询,要么使用TopLink Expression查询(不确定这一点,并且不确定这在TopLink Essentials中是否可用)。

以下为hibernate(4.3.9.Final)和JPA 2.1工作。

@NamedQuery(name =“PartyEntity.findByAID”,query =“从PartyShortCode psc中选择不同的psc.party,其中(psc.shortCode =:aidNumber或FUNCTION(’REPLACE’,psc.accountReference,”,”) =:aidNumber )和psc.sourceSystem in:sourceSystem“)