使用JPA获取存储在TIMESTAMP中的日期(按月或按年)

时间:2012-09-28 14:22:25

标签: 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'的意思是'日期'。

我需要通过YEAR或MONTH获取一个特定模块的失败,但我不能。我的ORM将TIMESTAMP类型映射到java.sql.Date,但我不知道如何比较JPQL语句中的月份。我试图将ORACLE函数与本机查询一起使用,但我还面临另一个问题:转换结果。 我正在使用JPA 2.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);

我收到此错误:Unexpected token [(]

我可以使用Eclipselink功能吗?我的经验说不。

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函数link
  • Eclipselink查询增强功能link

5 个答案:

答案 0 :(得分:1)

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

然而,还有另一种解决方案,测试时间戳与较低和较高的值:

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

答案 1 :(得分: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 ");

从数据库中存储的日期中提取年份避免了两个日期之间的比较。

答案 2 :(得分:1)

EclipseLink 2.4 for EXTRACT中的语法是,

EXTRACT(YEAR, f.fecha)

http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Querying/JPQL#Functions

答案 3 :(得分:1)

使用

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

答案 4 :(得分:0)

我遇到了同样的问题。我只检查了oracle的EXTRACT函数的正确语法,它对我有用! (注意FROM子句为函数语法。

@NamedQuery(name =“Registros.findByFechacaptura”,query =“SELECT s FROM Registros s WHERE EXTRACT(YEAR FROM s.fechacaptura)= EXTRACT(YEAR FROM:fechacaptura)”)