如何防止OpenJPA 2.2.2为多根查询添加额外的交叉连接

时间:2013-09-07 05:51:29

标签: openjpa

我有两个没有定义关系的表,但我仍然尝试使用条件构建器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。

0 个答案:

没有答案