Java n+;1.具有双向关系的选择
我正试图用Spring数据JPA获取整个实体图,但由于我的实体中的双向关系,我相信会得到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
我有以下父实体、子实体和孙子实体(遗留表的简化版本) 及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=?