3

jpa ネイティブ クエリを使用する必要があるという要件があります (jpa は timestampdiff 関数をサポートしていないため)。

また、次のように同じテーブルを 2 回選択する必要があります: テーブルがあります: 個人、タスクなど

私が使用したネイティブ クエリは次のとおりです。 p>

期待されるデータは「トム、タスク 1、ジャック」ですが、このネイティブ SQL クエリでは結果データは「ジャック、タスク 1、ジャック」です。これは、app.name が emp.name をオーバーライドすることを意味します。

正しい結果を取得したい場合は、次のようなクエリを使用する必要があります。 、個々のアプリの場合......."

ネイティブ クエリのコード (間違ったデータを取得):

String nativeSql = "select con.first_name, app.first_name from Individual con, Task tsk,    TimeBlock tb, Timesheet ts, Individual app where con.id=ts.owner_id and tb.timesheet_id=ts.id and tb.task_id=tsk.id and tsk.approver_id=app.id";
Query query = entityManager.createNativeQuery(nativeSql);

ネイティブ クエリのコード (正しいデータを取得できます):

String nativeSql = "select con.first_name, (select app.first_name from Individual app where tsk.approver_id=app.id) from Individual con, Task tsk, TimeBlock tb, Timesheet ts, Individual app where con.id=ts.owner_id and tb.timesheet_id=ts.id and tb.task_id=tsk.id and tsk.approver_id=app.id";
Query query = entityManager.createNativeQuery(nativeSql);

jpql クエリのコード:

String jpql = "select con.firstName, app.firstName from Individual con, Task tsk, TimeBlock tb, Timesheet ts, Individual app where con.id=ts.owner.id and tb.timesheet.id=ts.id and tb.task.id=tsk.id and tsk.approver.id=app.id";
Query query = entityManager.createQuery(jpql);

しかし、興味深いのは次のとおりです。

  1. このネイティブSQLクエリを使用してmysql dbから検索しました(コマンドライン、ワークベンチを使用)。結果データは正しい「Tom、task1、Jack」です

  2. timestampdiff 機能なしでこの要件に jpql を使用した場合、結果データも正しいものになります。

  3. jdbcを試してみましたが、jdbcでネイティブSQLクエリを使用した場合、正しいデータも取得できます。

jpaには問題があるようです....

以前にこの種の問題に遭遇し、その本質を知っている人なら誰でも。

ご協力いただきありがとうございます。

4

1 に答える 1

3

同じ問題が発生しましたが、問題を修正するために列のエイリアスを作成する必要があることがわかりました。

これは私に間違った結果を与えました:

SELECT i.number, taux5_50.vatAmount, taux19_60.vatAmount
FROM Invoice i
LEFT JOIN InvoiceVATLine taux5_50 ON taux5_50.invoice_id=i.id AND taux5_50.rate=5.50
LEFT JOIN InvoiceVATLine taux19_60 ON taux19_60.invoice_id=i.id AND taux19_60.rate=19.60
WHERE ...

これは私に正しい結果を与えました:

SELECT i.number, taux5_50.vatAmount AS taux5_50_vatAmount, taux19_60.vatAmount AS taux19_60_vatAmount
FROM Invoice i
LEFT JOIN InvoiceVATLine taux5_50 ON taux5_50.invoice_id=i.id AND taux5_50.rate=5.50
LEFT JOIN InvoiceVATLine taux19_60 ON taux19_60.invoice_id=i.id AND taux19_60.rate=19.60
WHERE ...
于 2013-01-28T09:14:48.673 に答える