【问题标题】:Getting around queries that use UNION in JPA绕过在 JPA 中使用 UNION 的查询
【发布时间】:2017-10-29 16:28:58
【问题描述】:

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

主要问题是该服务使用了一个本机查询,该查询包含通过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 个结果,这将导致服务器超时问题。

有人处理过类似的事情吗?

【问题讨论】:

  • 如果您使用外部自联接,您似乎可以取消 UNIONs,如 SELECT ... FROM PROCESS p0 LEFT OUTER JOIN TABLE_B ON ... LEFT OUTER JOIN TABLE_C ON ... WHERE TABLE_B.id is not null OR TABLE_C.id is not null

标签: java sql oracle jpa orm


【解决方案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

【讨论】:

猜你喜欢
  • 2013-09-28
  • 1970-01-01
  • 2020-05-08
  • 2012-03-21
  • 2014-02-05
  • 1970-01-01
  • 1970-01-01
  • 2010-09-17
  • 1970-01-01
相关资源
最近更新 更多