JPA查询MONTH / YEAR函数

问题描述 投票:15回答:5

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

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

当我使用上述模式进行查询时,出现错误:unexpected token - MONTH

java orm jpa jpql
5个回答
23
投票

如果使用的是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来定义它。


7
投票

我想查询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的执行速度更快。


3
投票

MONTH()函数在Hibernate HQL中存在,但不是标准的JPA函数。也许您的JPA提供者具有一些专有的等效物,但是您没有提及。如果不是,请使用本机SQL。


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

据我所知,TopLink没有直接的等效项。因此,要么使用本机SQL查询,要么使用TopLink Expression查询(对此不确定,也不确定TopLink Essentials中是否可用)。


1
投票

以下内容为我使用了休眠(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在:sourceSystem“)


0
投票

如果您的班级拥有日期类型变量,则可以使用如下查询:

@Query("select m from Movement m where m.id_movement_type.id=1 and SubString(cast(m.date as text),1,4) = :year")
    List<Movement> buysForYear(@Param("year") String year);
© www.soinside.com 2019 - 2024. All rights reserved.