首页 > 解决方案 > Spring Data + View with Union 返回重复行

问题描述

我正在使用 Spring Boot 2.4.2 和数据模块来实现 JPA。

现在,我正在使用由这个 JPA 实体映射的 Oracle 视图:

@Entity
@Immutable
@Table(name = "ORDER_EXPORT_V")
@ToString
@Data
@NoArgsConstructor
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
public class OrderExportView implements Serializable {

private static final long serialVersionUID = -4417678438840201704L;

@Id
@Column(name = "ID", nullable = false)
@EqualsAndHashCode.Include
private Long id;
....

该视图使用一个 UNION,它允许我获取同一父实体的两个不同属性,因此对于具有此 UNION 的一个相同父实体 (A),我在第 1 行中获得属性 B,在第 2 行中获得属性 C:这意味着行将彼此不同。

如果我使用 Oracle 客户端运行查询,我会得到我期望的结果集:相同的父实体具有 2 个包含不同属性的不同行。现在的问题:当我使用 Spring Data (JPA) 运行查询时,我得到了错误的结果集:两行但重复。

在调试中,我检查了执行 Spring Data 的查询,它是正确的;如果我运行相同的查询,结果集是正确的,但来自 Java/Spring Data 不是。为什么??

谢谢你的支持!

标签: springoraclespring-data-jpaduplicatesunion

解决方案


我知道了!我在 ID 字段中写错了。

两行具有相同的父 id,这对 JPA 不利,它希望每一行都有一个唯一值。所以,现在我在视图中引入了一个 UUID 字段:

sys_guid() AS uuid

在 JPA 实体中:

@Id
@Column(name = "UUID", nullable = false)
@EqualsAndHashCode.Include
private UUID uuid;

@Column(name = "ID")
private Long id;

现在一切正常,因为新字段的每一行都有一个唯一值。


推荐阅读