我有两个没有定义关系的表,但我仍然尝试使用条件构建器API在单个查询中将它们连接在一起。
此查询按我的意愿工作 - 同步两个表中的行:
Root<E_Application> root = q.from(E_Application.class);
Root<E_Searcher> root2 = q.from(E_Searcher.class);
q.where(cb.equal(root.get(E_Application_.packageName),
root2.get(E_Searcher_.packageName)));
q.select(cb.sum(cb.literal(1)));
出来的查询是:select sum(1) from application t0 cross join application_searcher t1 where (t0.package_name = t1.package_name);
但是,如果我添加另一个连接:
Root<E_Application> root = q.from(E_Application.class);
Root<E_Searcher> root2 = q.from(E_Searcher.class);
Join<E_Application, E_AppState> j1 =
root.join(E_Application_.publicAppState);
q.where(cb.equal(root.get(E_Application_.packageName),
root2.get(E_Searcher_.packageName)));
q.select(cb.sum(cb.literal(1)));
我获得了额外的交叉加入,最终获得了笛卡尔积:SELECT SUM(1) FROM application t0 CROSS JOIN application t1 CROSS JOIN application_search t3 INNER JOIN application_state t2 ON t1.PUBLICAPPSTATE_ID = t2.id WHERE (t0.package_name = t3.package_name)
有没有办法阻止这种情况(除了定义Application和Searcher之间的正确关系)?这是规范的正确实现吗?有点奇怪的是,生成的查询实际上有一个我没有明确请求的根,并且无法控制......
数据库是postgres,如果重要的话。
P.S。没有关系的原因是因为这两个表的PK相同,并且你不能拥有也是实体引用的PK。