gpt4 book ai didi

java - Hibernate 多对一急切获取 N+1

转载 作者:行者123 更新时间:2023-12-01 13:01:02 25 4
gpt4 key购买 nike

我有以下 JPA 实体:

@Entity
@Table(name = "app")
public class App {

@Id
private String id;

@OneToOne(mappedBy = "app")
@PrimaryKeyJoinColumn
private FileDetails fileDetails;

@ManyToOne
private Developer developer;

@ManyToOne
@JoinColumn(name = "category_id")
private Category category;

@OneToMany(mappedBy = "app", fetch = FetchType.EAGER)
private List<Image> images;

//getters, setters
}

如您所见,图像实体设置为EAGER 抓取。我想使用分页选择所有实体,并且我的 Generic DAO 使用此方法:

public List<T> findByPage(int pageNum, int pageSize) {
CriteriaQuery<T> cq = getEntityManager()
.getCriteriaBuilder().createQuery(entity);
cq.select(cq.from(entity));

int firstResult = pageNum * pageSize;
return getEntityManager().createQuery(cq)
.setFirstResult(firstResult)
.setMaxResults(pageSize)
.getResultList();
}

但是,当我运行查询时,我有一个与图像实体相关的 N+1。因此,对于每个选定的应用程序,我都会选择 N 个图像数量。 EAGER fetching 不是应该解决这个问题吗?解决方案是什么?

最佳答案

IIRC,在该查询中 join (fetch) 到 Image 可以解决此类问题。

现在,由于您需要指定 Image 类,我将向您展示一个非通用解决方案,以便您可以验证它是否有效。

// notice I changed all <T> to <App>
public List<App> findByPage(int pageNum, int pageSize) {
CriteriaQuery<App> cq = getEntityManager()
.getCriteriaBuilder().createQuery(entity);

Root<App> root = query.from(App.class); // added this
root.fetch("app"); // added this, this is the join

cq.select(cq.from(entity));

int firstResult = pageNum * pageSize;
return getEntityManager().createQuery(cq)
.setFirstResult(firstResult)
.setMaxResults(pageSize)
.getResultList();
}

我对此不是100%(我没有测试过,也不知道“app”字符串是否正确 - 它应该是你想要的字段到“拉”,但由于这是多对一,我不确定,并将该字段放置在引用 AppImage 中),但我认为解决方案位于 join 周围,希望这指向正确的方向。

关于java - Hibernate 多对一急切获取 N+1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23520705/

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