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);
しかし、興味深いのは次のとおりです。
このネイティブSQLクエリを使用してmysql dbから検索しました(コマンドライン、ワークベンチを使用)。結果データは正しい「Tom、task1、Jack」です
timestampdiff 機能なしでこの要件に jpql を使用した場合、結果データも正しいものになります。
jdbcを試してみましたが、jdbcでネイティブSQLクエリを使用した場合、正しいデータも取得できます。
jpaには問題があるようです....
以前にこの種の問題に遭遇し、その本質を知っている人なら誰でも。
ご協力いただきありがとうございます。