2012-04-10 5 views
2

jpaネイティブクエリを使用する必要があります(jpaはtimestampdiff関数をサポートしていないため)。jpaネイティブクエリは、同じテーブルを2つ選択して問題が発生する(休止状態の実装)

また、私のような、二度同じテーブルを選択してください: 私はテーブルを持っている:個人、タスク、およびなど

iが使用ネイティブクエリは次のとおりです。「emp.nameを選択し、tsk.name、app.name 、個々のemp、タスクtsk、個々のアプリケーションからどこか......... "

期待するデータは" Tom、task1、Jack "ですが、結果データは "Jack、task1、Jack"であり、このネイティブSQLクエリーが与えられています。つまり、app.nameはemp.nameをオーバーライドします。

私は正しい結果を取得したい場合は私のようなクエリを使用する必要があります:個体から、(xx.id = xx.id個々のアプリからapp.nameを選択)、「emp.nameを選択し、tsk.name EMP、タスクTSK、ネイティブクエリの個別のアプリ...............」

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

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 query :

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. 私はMySQLのDBから検索するには、このネイティブのSQLクエリを使用(コマンドラインを使用して、どのような作業台)、結果データが正しいもの「トムです、 task1、Jack "

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

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

それは前にこの種の問題に会い、その基本的なを知っているので、誰

.... JPAのためのいくつかの問題です。

ありがとうございました。

+1

あなたはコードを表示することができますか?また、どのJPA実装を使用していますか? – axtavt

+0

OK、コードサンプルは – ttt

+0

ここにはありません:(私にも同様の問題があり、完全に固執しています。 – khizar

答えて

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 ... 
関連する問題