解决在JPA中使用UNION的查询

时间:2017-05-29 11:16:31

标签: java sql oracle jpa orm

所以我正在从使用本机查询检索数据的旧应用程序迁移一些服务,我发现了一些问题,并想讨论解决它们的最佳方法。

主要问题是此服务使用本机查询,该查询包含通过UNION语句连接的其他几个查询。像这样:

WITH TMP_QUERY AS (
select p.id,p.name from PROCESS p inner join TABLE_B on ...
UNION
select p.id,p.name from PROCESS p inner join TABLE_C on ...
UNION
select p.id,p.name from PROCESS p inner join TABLE_A on ...)
select p.name from PROCESS p inner join TMP_QUERY tmp on p.id = tmp.id order 
by 1

由于JPA不支持UNION语句,我所考虑的唯一解决方案是单独执行这些查询,然后在java代码中执行重复删除,排序和分页。

可能会将结果添加到集合中以删除重复项,然后应用Comparator来订购返回的实体。但另一个问题是我还需要分页,因为任何这些查询都可能返回10到1000个结果,这将导致服务器超时问题。

有没有人处理类似的事情?

1 个答案:

答案 0 :(得分:1)

我认为你可以用子查询替换那些UNION语句,并使用JPQL / HQL来实现持久性提供程序orm支持的使用:

select p.name as name 
from Process p  
where (p.id, p.name) in
    (
        select pp.id,pp.name from Process pp inner join pp.tableB b ...
    )   
    or (p.id, p.name) in
    (
        select pp.id,pp.name from Process pp inner join pp.tableC c ...
    )   
    or (p.id, p.name) in
    (
        select pp.id,pp.name from Process pp inner join pp.tableA a ...
    )

order by name