gpt4 book ai didi

java - Spring JPA Join效率——每次迭代创建查询

转载 作者:行者123 更新时间:2023-11-28 23:25:13 25 4
gpt4 key购买 nike

我有一个简单的 2 个 JPA 实体,它们之间有一个连接:

主要实体国家:

public class Country implements Serializable {

@Id
@Column(name = "MCC")
private String mcc;

......

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "mcc", referencedColumnName = "mcc")
private List<CountryInfo> countryInfo;

联合实体国家信息:

public class CountryInfo implements Serializable {

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

@Column(name = "mcc")
private String mcc;

@Column(name = "continent")
private String continent;

当我打开我的配置以转储正在执行的查询时,我注意到对于找到的每个 Country,都会对 CountryInfo 实体进行另一个调用使用指定的 mcc..

这显然很慢,因为它不是使用 JOIN 创建 1 个调用,而是执行 N + 1 个查询(其中 N = Country 的计数)。

我已经看过这个教程了https://zeroturnaround.com/rebellabs/how-to-use-jpa-correctly-to-avoid-complaints-of-a-slow-application/并相应地进行了更改,但它仍在调用 N + 1 个查询..

有没有办法克服这个问题?


编辑

为了获取数据,我有一个Repository:

@RepositoryRestResource(exported = false)
public interface CountryRepository extends JpaRepository<E212MCC, Long>,
JpaSpecificationExecutor<E212MCC> {
}

然后调用一些规范:

List<E212MCC> countries = this.countryRepository.findAll(specifications);

最佳答案

由于您使用的是 Specifications,您可以尝试使用执行 fetch join 操作的规范(我假设您使用的是 JPA 元模型):

private Specification<Country> joinContryInfo() {
return (root, query, cb) -> {
root.fetch(Country_.countryInfo);
// here you can fetch more entities if you need...
return null;
};
}

然后,只需将它添加到您的规范对象中:

Specifications.where(joinCountryInfo())

如果您不使用元模型,则只需将 Country_.countryInfo 替换为 "countryInfo" 字符串。

如果您使用 CountryInfo 字段进行搜索,您可以省略 joinContryInfo() 规范并在一个规范中准备连接和搜索查询:

private Specification<Country> continentEqual(String param) {
return (root, query, cb) -> {
Join<Country,CountryInfo> join = (Join) root.fetch(Country_.countryInfo);
return cb.equal(join.get(CountryInfo_.continent), addWildCards(param));;
};
}

关于java - Spring JPA Join效率——每次迭代创建查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39661578/

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