因此,我正在迁移一些使用本机查询检索数据的服务和旧应用程序,我发现了一些问题,并希望讨论解决这些问题的最佳方法。
主要问题是,该服务使用一个本机查询,该查询包含通过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秒的结果,这将导致服务器超时问题。
有人处理过类似的事情吗?
发布于 2017-05-29 11:33:47
我认为您可以用子查询替换这些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
发布于 2022-06-26 09:11:11
如果您将Union/Union全部更改为本机查询并使用类似于下面的
//In Your Entity class
@NamedNativeQuery(name="EntityClassName.functionName",
query="your_native_query")
//In your Repository class
@Query(native=true)
List<Result> functionName();
下面定义JPA存储库中的原生查询的方法不会解决这个问题,
@Query(value="your_native_query", native=true)
不会
https://stackoverflow.com/questions/44241202
复制相似问题