【发布时间】:2011-04-10 03:05:00
【问题描述】:
如何像 sql 查询一样使用 MONTH 函数编写 JPA 查询?
@NamedQuery(name="querybymonth", query="select t from table1 t where MONTH(c_Date) = 5")
当我使用上述模式进行查询时,我得到一个错误:unexpected token - MONTH。
【问题讨论】:
如何像 sql 查询一样使用 MONTH 函数编写 JPA 查询?
@NamedQuery(name="querybymonth", query="select t from table1 t where MONTH(c_Date) = 5")
当我使用上述模式进行查询时,我得到一个错误:unexpected token - MONTH。
【问题讨论】:
MONTH() 函数存在于 Hibernate HQL 中,但不是标准的 JPA 函数。也许你的 JPA 提供者有一些专有的等价物,但你没有提到它。如果没有,请使用原生 SQL。
我也在使用 Toplink Essentials。请帮助,如果 Toplink 中存在任何功能。谢谢。
据我所知,TopLink 没有直接的等价物。因此,要么使用本机 SQL 查询,要么使用 TopLink 表达式查询(对此不确定,也不确定 TopLink Essentials 是否可用)。
【讨论】:
如果您使用的是 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 执行起来更快。
【讨论】:
以下对我来说适用于休眠 (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 in :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);
【讨论】: