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);
しかし興味深いのは次のとおりです。
私はMySQLのDBから検索するには、このネイティブのSQLクエリを使用(コマンドラインを使用して、どのような作業台)、結果データが正しいもの「トムです、 task1、Jack "
timestampdiff機能なしでこの要件にjpqlを使用した場合、結果データも正しいです。
jdbcでネイティブSQLクエリを使用した場合、正しいデータを取得できます。
それは前にこの種の問題に会い、その基本的なを知っているので、誰
.... JPAのためのいくつかの問題です。
ありがとうございました。
あなたはコードを表示することができますか?また、どのJPA実装を使用していますか? – axtavt
OK、コードサンプルは – ttt
ここにはありません:(私にも同様の問題があり、完全に固執しています。 – khizar