我有两个没有定义关系的表,但我仍在尝试使用标准构建器 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)
有什么办法可以防止这种情况(除了定义应用程序和搜索器之间的正确关系)?这是规范的正确实现吗?结果查询实际上有一个我没有明确请求的根,并且无法控制……这有点奇怪。
如果重要的话,数据库是 postgres。
PS 之所以没有关系是因为这两个表的 PK 相同,不能有一个 PK 也是实体引用。