2

私は問題に直面しており、あなたに助けてもらいたいです。

Oracle 11g データベースには、1 つの電子デバイスの障害を保存するテーブルが 1 つあります。テーブルの定義は次のとおりです。

CREATE TABLE failure
( failure_id NUMERIC NOT NULL
, fecha TIMESTAMP NOT NULL
, module_id NUMERIC NOT NULL
, code NUMERIC
, PRIMARY KEY(failure_id)
);

「fecha」は「日付」を意味します。

1 つの特定のモジュールについて YEAR または MONTH ごとに失敗をフェッチする必要がありますが、できません。私の ORM は TIMESTAMP 型を java.sql.Date にマップしますが、JPQL 文で月を比較する方法がわかりません。ネイティブクエリで ORACLE 関数を使用しようとしましたが、結果をキャストするという別の問題に直面しています。Eclipselink 2.3.2 で JPA 2.0 を使用しています。

私の疑問は次のとおりです。

このバージョンの 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);

同じエラー。

1 つのクエリだけを使用してこのデータを取得する簡単な方法を知っていますか? 1 つのモジュールをフェッチして、ループで障害をチェックできることはわかっていますが、それは最高のパフォーマンスを発揮するソリューションではないと思います。

ありがとう。

私の情報源:

4

5 に答える 5

1

ネイティブ クエリは DB の SQL ダイアレクトで記述されるため、DB 固有の機能を使用できます。EntityManager の createNativeQuery メソッドを参照してください。

ただし、別の解決策があります。タイムスタンプを下限値と上限値に対してテストします。

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

EXTRACT の EclipseLink 2.4 の構文は次のとおりです。

EXTRACT(YEAR, f.fecha)

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

于 2012-11-08T14:08:31.730 に答える
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 回比較する必要がなくなります。

于 2012-11-07T16:30:18.367 に答える
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 に答える