2

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

事实证明,我的 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 将 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 函数链接
  • Eclipselink 查询增强链接
4

5 回答 5

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

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

于 2012-11-07T16:30:18.367 回答
1

EclipseLink 2.4 中 EXTRACT 的语法是,

EXTRACT(YEAR, f.fecha)

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

于 2012-11-08T14:08:31.730 回答
1

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

但是,还有另一种解决方案,根据较低和较高的值测试时间戳:

WHERE f.fecha >= '2012-9-1' AND f.fecha < '2012-10-1'
于 2012-09-28T17:27:49.103 回答
1

利用

Query query = entityManager.createQuery("SELECT f FROM Failure f "
        + "WHERE EXTRACT(YEAR from f.fecha) = ?1 "
        + "AND f.moduleId.moduleId = ?2");
于 2015-01-28T12:45:46.283 回答
0

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

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

于 2018-03-13T23:48:39.813 回答