Java 休眠多对一即时获取N+1
我拥有以下JPA实体:Java 休眠多对一即时获取N+1,java,hibernate,jpa,Java,Hibernate,Jpa,我拥有以下JPA实体: @Entity @Table(name = "app") public class App { @Id private String id; @OneToOne(mappedBy = "app") @PrimaryKeyJoinColumn private FileDetails fileDetails; @ManyToOne private Developer developer; @ManyToO
@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
}
但是,当我运行查询时,相对于图像实体,我有一个N+1。因此,对于选择的每个应用程序,我会得到N个图像数量的选择。急切抓取不应该解决这个问题吗?还有什么解决方案呢?IIRC,在该查询中对图像进行连接获取可以解决此类问题
现在,由于您需要指定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%相信这一点,我还没有测试过,也不知道应用程序字符串是否正确-它应该是你想要拉的字段,但由于这是多对一的,我不确定,并将字段放在图像中,而该图像指向应用程序,但我认为解决方案是围绕连接的某个地方,希望这指向正确的方向
// 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();
}