Java 休眠多对一即时获取N+1

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

我拥有以下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
}
但是,当我运行查询时,相对于图像实体,我有一个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();
}