首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在JPA中使用UNION的查询

在JPA中使用UNION的查询
EN

Stack Overflow用户
提问于 2017-05-29 11:16:31
回答 2查看 6.4K关注 0票数 3

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

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

代码语言:javascript
运行
复制
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秒的结果,这将导致服务器超时问题。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-29 11:33:47

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

代码语言:javascript
运行
复制
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
票数 2
EN

Stack Overflow用户

发布于 2022-06-26 09:11:11

如果您将Union/Union全部更改为本机查询并使用类似于下面的

代码语言:javascript
运行
复制
//In Your Entity class
@NamedNativeQuery(name="EntityClassName.functionName", 
query="your_native_query")

//In your Repository class
@Query(native=true)
List<Result> functionName();

下面定义JPA存储库中的原生查询的方法不会解决这个问题,

代码语言:javascript
运行
复制
@Query(value="your_native_query", native=true)

不会

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44241202

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档