Performance 使用JPA获取存储在时间戳中的日期(按月或按年)

Performance 使用JPA获取存储在时间戳中的日期(按月或按年),performance,oracle,jpa,eclipselink,jpql,Performance,Oracle,Jpa,Eclipselink,Jpql,我面临一个问题,我希望你能帮助我 事实证明,我的Oracle 11g数据库中有一个表,其中存储了一个电子设备的故障。表定义如下: CREATE TABLE failure ( failure_id NUMERIC NOT NULL , fecha TIMESTAMP NOT NULL , module_id NUMERIC NOT NULL , code NUMERIC , PRIMARY KEY(failure_id) ); 其中“fecha”表示“日期” 我需要每年或每月获取一个特定模块的

我面临一个问题,我希望你能帮助我

事实证明,我的Oracle 11g数据库中有一个表,其中存储了一个电子设备的故障。表定义如下:

CREATE TABLE failure
( failure_id NUMERIC NOT NULL
, fecha TIMESTAMP NOT NULL
, module_id NUMERIC NOT NULL
, code NUMERIC
, PRIMARY KEY(failure_id)
);
其中“fecha”表示“日期”

我需要每年或每月获取一个特定模块的故障,但我不能。我的ORM将时间戳类型映射到java.sql.Date,但我不知道如何比较JPQL语句中的月份。我曾尝试将ORACLE函数用于本机查询,但我提出了另一个问题:转换结果。 我正在使用JPA2.0和Eclipselink 2.3.2

我的疑问是:

我可以在这个版本的Eclipselink库中使用Oracle函数吗?我的经验是否定的

Query query = entityManager.createQuery("SELECT f FROM Failure f "
            + "WHERE EXTRACT(YEAR FROM f.fecha) = ?1 "
            + "AND f.moduleId.moduleId = ?2");
    query.setParameter(1, year);
    query.setParameter(2, idModule);
Query query = entityManager.createQuery("SELECT f FROM Failure f "
            + "WHERE EXTRACT('YEAR', f.fecha) = ?1 "
            + "AND f.moduleId.moduleId = ?2");
    query.setParameter(1, year);
    query.setParameter(2, idModule);
我收到以下错误:意外令牌[]

我可以使用Eclipselink函数吗?我的经验是否定的

Query query = entityManager.createQuery("SELECT f FROM Failure f "
            + "WHERE EXTRACT(YEAR FROM f.fecha) = ?1 "
            + "AND f.moduleId.moduleId = ?2");
    query.setParameter(1, year);
    query.setParameter(2, idModule);
Query query = entityManager.createQuery("SELECT f FROM Failure f "
            + "WHERE EXTRACT('YEAR', f.fecha) = ?1 "
            + "AND f.moduleId.moduleId = ?2");
    query.setParameter(1, year);
    query.setParameter(2, idModule);
同样的错误

您知道只使用一个查询获取此数据的简单方法吗? 我知道我可以获取一个模块,然后用循环检查故障,但我认为这不是性能最好的解决方案

谢谢

我的资料来源:

Eclipselink JPA函数 Eclipselink查询增强功能
本机查询是用数据库的SQL方言编写的,因此可以使用特定于数据库的功能。请参阅EntityManager的createNativeQuery方法

但是,还有另一种解决方案,根据下限和上限值测试时间戳:

WHERE f.fecha >= '2012-9-1' AND f.fecha < '2012-10-1'

本机查询是用数据库的SQL方言编写的,因此可以使用特定于数据库的功能。请参阅EntityManager的createNativeQuery方法

但是,还有另一种解决方案,根据下限和上限值测试时间戳:

WHERE f.fecha >= '2012-9-1' AND f.fecha < '2012-10-1'

我使用了Eclipselink v 2.4函数,并使用以下函数获取值:

Query query = entityManager.createQuery("SELECT f FROM Failure f "
                + "WHERE SQL('EXTRACT (YEAR FROM ?)', f.fecha) = ?1 "
                + "AND f.moduleId.moduleId = ?2 ");

从数据库中存储的日期中提取年份可以避免对两个日期进行一次比较。

我使用了Eclipselink v 2.4函数,并使用以下方法获取值:

Query query = entityManager.createQuery("SELECT f FROM Failure f "
                + "WHERE SQL('EXTRACT (YEAR FROM ?)', f.fecha) = ?1 "
                + "AND f.moduleId.moduleId = ?2 ");

从数据库中存储的日期中提取年份可以避免对两个日期进行一次比较。

EclipseLink 2.4中提取的语法是

EXTRACT(YEAR, f.fecha)

EclipseLink 2.4中提取的语法是

EXTRACT(YEAR, f.fecha)
使用

使用


我也面临同样的问题。我只检查了oracle提取函数的正确语法,它对我有效!注意函数语法中的FROM子句


@NamedQueryname=Registros.findByFechacaptura,query=SELECT s FROM Registros s其中EXTRACTYEAR FROM s.fechacaptura=EXTRACTYEAR FROM:fechacaptura我面临同样的问题。我只检查了oracle提取函数的正确语法,它对我有效!注意函数语法中的FROM子句


@NamedQueryname=Registros.findByFechacaptura,query=SELECT s FROM Registros s其中EXTRACTYEAR FROM s.fechacaptura=EXTRACTYEAR FROM:fechacaptura

你好,伊尔克,谢谢你的回复。是的,我知道CreateNativeQuery,但它通常返回一个对象,然后我应该将其强制转换为我的特定对象。我不喜欢这样。最后,我决定使用两个日期来获取一个完整的月份或一个完整的年份。谢谢您的回复和注意。我认为在这种情况下使用Eclipse功能比两个日期的比较要好。这就是为什么我更改了正确答案,即使你的解决方案很好。你好,艾尔克,谢谢你的回复。是的,我知道CreateNativeQuery,但它通常返回一个对象,然后我应该将其强制转换为我的特定对象。我不喜欢这样。最后,我决定使用两个日期来获取一个完整的月份或一个完整的年份。谢谢您的回复和注意。我认为在这种情况下使用Eclipse功能比两个日期的比较要好。这就是为什么我更改了正确答案,即使您的解决方案运行良好。您链接到的页面显示,在您声明正在使用2.3.2时,EXTRACT函数已添加到EclipsLink 2.4。试试后面的版本。@Chris是的,你说得对。我尝试使用EclipseLink 2.4,但无法应用新功能。我不知道出了什么事。。你用过吗?它有效吗?ThanksEclipseLink 2.4夜间测试验证提取工作:您能提供哪些不适合您的详细信息吗?@Chris我已将eclipselink更新为2.4.0版,并尝试使用提取运行测试,如下所示:Query Query=entityManager.createQuerySELECT f FROM Failure f+WHERE EXTRACTYEAR,f、 fecha=?1+和f.moduleId.moduleId=?2;我得到的错误是:表达式不是有效的条件表达式[42,42]必须指定日期部分[42,42]提取表达式中缺少左括号[43,68]查询包含格式错误的结尾。链接到的页面显示,在您声明正在使用2.3.2时,提取函数已添加到EclipsLink 2.4。试试后面的版本。@Chris是的,你说得对。我尝试使用EclipseLink 2.4,但无法应用新功能。我不知道发生了什么事
G你用过吗?它有效吗?ThanksEclipseLink 2.4夜间测试验证提取工作:您能提供哪些不适合您的详细信息吗?@Chris我已将eclipselink更新为2.4.0版,并尝试使用提取运行测试,如下所示:Query Query=entityManager.createQuerySELECT f FROM Failure f+WHERE EXTRACTYEAR,f、 fecha=?1+和f.moduleId.moduleId=?2;我得到的错误是:表达式不是有效的条件表达式[42,42]必须指定日期部分[42,42]提取表达式中缺少左括号[43,68]查询包含格式错误的结尾。我可以在SELECT的WHERE侧执行此操作吗?对我无效。Query Query=entityManager.createQuerySELECT f FROM Failure f+,其中提取年份f.fecha=?1+和f.moduleId.moduleId=?2;我看到了一些错误:提取表达式中缺少左括号,必须指定日期部分,查询包含格式错误的结尾。我现在收到了此错误:意外标记[]。内部异常:NoViableAltException83@[*383:9:d=DOT right=attribute*]可能与Eclipselink库有关?请尝试从f.fecha中提取,用户指南中提到的函数用法是错误的,@请参见“选择”的何处可以这样做?对我不起作用。Query Query=entityManager.createQuerySELECT f FROM Failure f+,其中提取年份f.fecha=?1+和f.moduleId.moduleId=?2;我看到了一些错误:提取表达式中缺少左括号,必须指定日期部分,查询包含格式错误的结尾。我现在收到了此错误:意外标记[]。内部异常:NoviablealException83@[*383:9:d=DOT right=attribute*]可能与Eclipselink库有关?请尝试从f.fecha中提取,用户指南中提到的函数用法是错误的,@请看,我使用的是Eclipselink 2.5,并且只有这种方法。我使用的是Eclipselink 2.5,并且只有这种方法才使用。