【问题标题】:JPA: How to union table from different schemaJPA:如何联合来自不同模式的表
【发布时间】:2021-11-01 00:29:48
【问题描述】:

我正在使用带有 oracle 数据库的 spring-data-jpa,并且需要从两个具有相同结构但不同模式的表中进行联合选择。 jpa 可以做到这一点(不使用数据库视图)吗?

更新:

因为我有很多表,所以我决定不使用 union 创建本机 sql 语句。相反,我使用 StatementInspector 添加架构并创建联合 sql 语句。如果我有没有 where 条件的 select 语句,这很好用。一旦我使用 where 条件,我就会得到一个 SQL 错误:17041 "Missing IN or OUT parameter",因为未设置联合选择中的参数。 Hibernate 使用问号(位置参数)来设置查询参数,我无权访问拦截器中的参数。有没有办法在春季启动/休眠中设置命名参数而不是问号?还是有人已经遇到过类似的问题并且知道我该如何解决?

【问题讨论】:

  • 只要你连接的数据库用户可以访问两个表
  • 也许我应该更具体地回答我的问题。我怎样才能实现我用 JPA 描述的内容?即使是原生查询也不适合我。
  • 您必须有两个实体,每个表一个。您不能使用相同的实体
  • 但是联合的结果不能是实体。
  • @SimonMartinelli 谢谢。我会试试的。

标签: hibernate jpa spring-data-jpa


【解决方案1】:

您可以使用以下模型:

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Example {
  @Id
  String item1;
  String item2;
  String item3;
}
@Entity
@Table(schema = "US", name = "example")
public class ExampleUS extends Example {}
@Entity
@Table(schema = "EU", name = "example")
public class ExampleEU extends Example {}

然后简单地查询Example,这将导致类似于以下的查询:

select * from (select ... from US.example union all select ... from EU.example)

这应该按照您想要的方式工作。如果您对 set 操作有进一步的需求,您可以查看 Blaze-Persistence,它在 Hibernate/JPA 之上工作并支持 set operations

【讨论】:

    猜你喜欢
    • 2013-06-07
    • 1970-01-01
    • 2011-01-14
    • 2015-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多