如何使用MONTH
类似于 sql 查询的函数编写 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 表达式查询(类似于 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 中存在任何功能。谢谢。
据我所知,TopLink 没有直接的等价物。因此,要么使用本机 SQL 查询,要么使用 TopLink 表达式查询(对此不确定,也不确定 TopLink Essentials 中是否可用)。
以下为我使用了休眠(4.3.9.Final)和 JPA 2.1。
@NamedQuery(name = "PartyEntity.findByAID", query = "select distinct psc.party from PartyShortCode psc where (psc.shortCode = :aidNumber or FUNCTION('REPLACE',psc.accountReference,' ','') = :aidNumber ) 和 psc.sourceSystem 在 :sourceSystem")
如果你的类包含一个日期类型变量,你可以使用这样的查询:
@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);