【问题标题】:JPA Query MONTH/YEAR functionsJPA 查询 MONTH/YEAR 函数
【发布时间】: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

【问题讨论】:

    标签: java orm jpa jpql


    【解决方案1】:

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


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

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

    【讨论】:

    • 嗨!我也在使用 Toplink Essentials。请帮助,如果 Toplink 中存在任何功能。谢谢。
    【解决方案2】:

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

    【讨论】:

    • 嗨詹姆斯,感谢您的回答。我实际上正在使用 toplink 要领。我应用了上述方式,但我仍然得到:Unexpected Token - FUNC。请帮忙!
    • @venomrld 正如 James 所写,这个 FUNC 东西在 EclipseLink 2.1+ 中可用,请参阅 Bug 300512。所以不要指望在 TopLink Essentials 中找到它。
    • 所以我被卡住了。如果存在某种方式,请提供帮助。我正在使用 netbeans 6.5 和视觉面孔进行开发。似乎我必须更改很多代码才能迁移。
    【解决方案3】:

    我想查询 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 执行起来更快。

    【讨论】:

    • 感谢您的回复.. 实际上我面临的问题是值是动态的.. 即这些值仅取自变量...所以我切换到本机 SQL 查询,它们工作得很好。无论如何,再次感谢。
    【解决方案4】:

    以下对我来说适用于休眠 (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")

    【讨论】:

      【解决方案5】:

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

      @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);
      

      【讨论】:

        猜你喜欢
        • 2013-09-23
        • 2012-03-17
        • 1970-01-01
        • 1970-01-01
        • 2011-12-08
        • 1970-01-01
        • 2021-12-12
        • 2022-11-17
        • 1970-01-01
        相关资源
        最近更新 更多