Java n+;1.具有双向关系的选择

Java n+;1.具有双向关系的选择,java,hibernate,jpa,spring-data-jpa,Java,Hibernate,Jpa,Spring Data Jpa,我正试图用Spring数据JPA获取整个实体图,但由于我的实体中的双向关系,我相信会得到n+1个选择。 我有以下父实体、子实体和孙子实体(遗留表的简化版本) 及JPA资料库; @Repository public interface ParentRepository extends JpaRepository<Parent, Long> { @Query(value = "SELECT p FROM Parent p " + "JOIN FETCH

我正试图用Spring数据JPA获取整个实体图,但由于我的实体中的双向关系,我相信会得到n+1个选择。
我有以下父实体、子实体和孙子实体(遗留表的简化版本)

及JPA资料库;

@Repository
public interface ParentRepository extends JpaRepository<Parent, Long> {

    @Query(value = "SELECT p FROM Parent p " +
            "JOIN FETCH p.children c " +
            "JOIN FETCH c.grandchildren")
    List<Parent> testFind();
}
然后,为每个父母和子女提供额外的声明

select
        parent0_.id as id1_2_0_,
        parent0_.identity as identity2_2_0_ 
    from
        parent parent0_ 
    where
        parent0_.id=?

select
        child0_.child_col as child_co1_0_0_,
        child0_.parent_id as parent_i3_0_0_,
        child0_.identity as identity2_0_0_,
        parent1_.id as id1_2_1_,
        parent1_.identity as identity2_2_1_ 
    from
        child child0_ 
    inner join
        parent parent1_ 
            on child0_.parent_id=parent1_.id 
    where
        child0_.child_col=? 
        and child0_.parent_id=?

有没有办法在不使关系单向的情况下消除额外的选择?

您是否在ID类上实现了equals()和hashcode()?您在孙子的子属性上似乎也缺少@ID。我更新了帖子以反映equals()和hashcode()以及缺少的@ID字段。但hibernate生成的SQL是相同的。ID类上的equals()和hashcode()不是实体。很抱歉,已将equals和hashcode添加到ID类中,但不幸的是,SQL保持不变。同样,equals和hashcode函数对于Id类似乎没有受到影响。
@Repository
public interface ParentRepository extends JpaRepository<Parent, Long> {

    @Query(value = "SELECT p FROM Parent p " +
            "JOIN FETCH p.children c " +
            "JOIN FETCH c.grandchildren")
    List<Parent> testFind();
}
select
        parent0_.id as id1_2_0_,
        children1_.child_col as child_co1_0_1_,
        children1_.parent_id as parent_i3_0_1_,
        grandchild2_.child_col as child_co3_1_2_,
        grandchild2_.parent_id as parent_i4_1_2_,
        grandchild2_.grandchild_col as grandchi1_1_2_,
        parent0_.identity as identity2_2_0_,
        children1_.identity as identity2_0_1_,
        children1_.parent_id as parent_i3_0_0__,
        children1_.child_col as child_co1_0_0__,
        grandchild2_.identity as identity2_1_2_,
        grandchild2_.child_col as child_co3_1_1__,
        grandchild2_.parent_id as parent_i4_1_1__,
        grandchild2_.grandchild_col as grandchi1_1_1__ 
    from
        parent parent0_ 
    inner join
        child children1_ 
            on parent0_.id=children1_.parent_id 
    inner join
        grandchild grandchild2_ 
            on children1_.child_col=grandchild2_.child_col 
            and children1_.parent_id=grandchild2_.parent_id
select
        parent0_.id as id1_2_0_,
        parent0_.identity as identity2_2_0_ 
    from
        parent parent0_ 
    where
        parent0_.id=?

select
        child0_.child_col as child_co1_0_0_,
        child0_.parent_id as parent_i3_0_0_,
        child0_.identity as identity2_0_0_,
        parent1_.id as id1_2_1_,
        parent1_.identity as identity2_2_1_ 
    from
        child child0_ 
    inner join
        parent parent1_ 
            on child0_.parent_id=parent1_.id 
    where
        child0_.child_col=? 
        and child0_.parent_id=?