JPA查询MONTH / YEAR函数

时间:2010-09-09 07:27:21

标签: java orm jpa jpql

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

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

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

5 个答案:

答案 0 :(得分: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来定义它。

答案 1 :(得分:6)

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

答案 2 :(得分:3)

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


  

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

据我所知,TopLink没有直接的等价物。因此要么使用本机SQL查询,要么使用TopLink Expression查询(不确定这一点,并且不确定TopLink Essentials中是否可以使用它)。

答案 3 :(得分:1)

Following worked for me with hibernate (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) and psc.sourceSystem in :sourceSystem")

答案 4 :(得分:0)

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

import requests
import json


def main(url):
    with requests.Session() as req:
        for item in range(1, 1000, 100):
            r = req.get(url.format(item)).json()
            for a in r['result']:
                print("Headline: {}, Url: {}".format(
                    a['headline'], a['url']))


main("https://search.api.cnn.io/content?q=coronavirus&sort=newest&category=business,us,politics,world,opinion,health&size=100&from={}")