我需要使用jpa本机查询(因为jpa不支持timestampdiff函数)。
另外我应该选择两次相同的表,例如: 我有桌子:个人,任务等等
我使用的本机查询是:“select emp.name,tsk.name,app.name,来自Individual emp,Task tsk,Individual app where ................ “
我想要的预期数据是:“Tom,task1,Jack”,但是结果数据是“Jack,task1,Jack”给出了这个本机sql查询。这意味着app.name会覆盖emp.name。
如果我想获得正确的结果,我必须使用以下查询:“select emp.name,tsk.name,(从个人应用中选择app.name,其中xx.id = xx.id),来自Individual 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查询的代码:
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中搜索(使用命令行,workbench等),结果数据是正确的“Tom,task1,Jack”
如果我在没有timestampdiff功能的情况下使用jpql来满足此要求,那么结果数据也是正确的。
刚试过jdbc,如果我在jdbc中使用本机sql查询,我也可以得到正确的数据。
对于jpa来说似乎有些问题......
所以任何人之前遇到过这种问题并且知道其中的必要性。
感谢您的帮助。
答案 0 :(得分: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 ...