所以我正在从使用本机查询检索数据的旧应用程序迁移一些服务,我发现了一些问题,并想讨论解决它们的最佳方法。
主要问题是此服务使用本机查询,该查询包含通过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个结果,这将导致服务器超时问题。
有没有人处理类似的事情?
答案 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