17

如何使用MONTH类似于 sql 查询的函数编写 JPA 查询?

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

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

4

5 回答 5

27

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

于 2010-09-09T13:17:20.470 回答
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 执行起来更快。

于 2011-08-22T01:57:24.720 回答
3

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


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

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

于 2010-09-09T10:29:05.460 回答
1

以下为我使用了休眠(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")

于 2016-02-03T03:36:43.873 回答
-1

如果你的类包含一个日期类型变量,你可以使用这样的查询:

@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);
于 2020-04-10T19:25:07.907 回答