gpt4 book ai didi

Hibernate FetchMode.JOIN 在 Embeddable 中被忽略用作 ID

转载 作者:行者123 更新时间:2023-12-04 08:35:24 25 4
gpt4 key购买 nike

我有以下实体结构(给出了数据库):

@Data
@Entity
public class Report {

@EmbeddedId
private ReportId id;

private int numberOne;

private int numberTwo;
}

在我的报告中,我需要完整的网站。但它可能会被删除(没有外键约束)。

@Data
@Entity
public class Site {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

private String place;

private String name;
}

每个站点和每一天都有一份报告。我对来自已删除网站的报告不感兴趣。

@Embeddable
@Data
public class ReportId implements Serializable {

@NotFound(action = NotFoundAction.IGNORE) //without this we get EntityNotFoundException for deleted sites
@Fetch(FetchMode.JOIN)
@OneToOne
@JoinColumn(name = "site_id", referencedColumnName = "id")
private Site site;

@Column(name = "day")
private LocalDate date;
}

我想要的是“selectAll()”仅返回链接到现有网站的报告(按网站 ID 查找返回的不是空值)。如您所见,我已经尝试过 @NotFound(action = NotFoundAction.IGNORE) 但这会创建带有 site = null 的条目。

我认为我需要的是站点的左外部连接,但似乎 @Fetch(FetchMode.JOIN) 被忽略了 - 我仍然看到每个报告有 2 个选择(首先选择报告,第二次提取通过 id 的站点)。

我还尝试将这些注释放在报告中的 @EmbeddedId 列上,但这不起作用(@NotFound 也被忽略了)。

有没有办法在没有现有站点的情况下忽略所有报告? - 我不想手动编写查询。我想使用 Spring Data 存储库方法,例如 - findAll()

最佳答案

实际上,当您运行 findAll() 方法时,spring data jpa 会执行以下 jpa 查询:

select r from Report r

但正如它在 hibernate 状态中所说的那样 documentation :

The reason why we are not using a JPQL query to fetch multiple entities is because the FetchMode.JOIN strategy would be overridden by the query fetching directive.

To fetch multiple relationships with a JPQL query, the JOIN FETCH directive must be used instead.

Therefore, FetchMode.JOIN is useful for when entities are fetched directly, via their identifier or natural-id.

Also, the FetchMode.JOIN acts as a FetchType.EAGER strategy. Even if we mark the association as FetchType.LAZY, the FetchMode.JOIN will load the association eagerly.

因此,看起来如果没有单独的查询,您将无法实现您想要的结果。

关于Hibernate FetchMode.JOIN 在 Embeddable 中被忽略用作 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64823119/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com