Spring Data + View with Union 返回重复行

Posted

技术标签:

【中文标题】Spring Data + View with Union 返回重复行【英文标题】:Spring Data + View with Union return duplicate rows 【发布时间】:2021-07-14 20:19:14 【问题描述】:

我正在使用 Spring Boot 2.4.2 和 Data 模块来实现 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 不是。为什么??

感谢您的支持!

【问题讨论】:

看起来像一对多的问题:***.com/questions/16341408/… 【参考方案1】:

我明白了!我在 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;

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

【讨论】:

以上是关于Spring Data + View with Union 返回重复行的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot with Spring Data JPA - Concept

SAPUI5使用XML-File作为View with“data-sap-ui-resourceroots”?

Spring Boot with Spring-Data-JPA学习案例

《Pro Spring Boot 2》第五章:Data Access with Spring Boot

Persisting data with object-relational mapping-006Spring-Data的运行规则(@Enabl

Spring Data Rest with Spring Security - 按当前用户查找所有内容