Java spring数据JPA忽略查询方法上的fetchmode

Java spring数据JPA忽略查询方法上的fetchmode,java,hibernate,jpa,spring-data-jpa,spring-data,Java,Hibernate,Jpa,Spring Data Jpa,Spring Data,我拥有具有可传递关系的实体。因此,实体A映射到实体B的一个域,实体B映射到实体C的一个域。 实体A有一个属性userID,它不是主键,我需要从数据库中获取用户ID的所有记录。由于需要,我急切地想要取A和B的子记录。我用fetchmodejoin注释了实体,我的存储库有一个findByUserId(int userId)方法。 我使用SpringDataJPA和hibernate作为底层ORM。 执行上述查询方法将触发多个查询,尽管我希望只触发一个带有join的查询 我已经尝试过EntityGra

我拥有具有可传递关系的实体。因此,实体A映射到实体B的一个域,实体B映射到实体C的一个域。 实体A有一个属性userID,它不是主键,我需要从数据库中获取用户ID的所有记录。由于需要,我急切地想要取A和B的子记录。我用fetchmodejoin注释了实体,我的存储库有一个findByUserId(int userId)方法。 我使用SpringDataJPA和hibernate作为底层ORM。 执行上述查询方法将触发多个查询,尽管我希望只触发一个带有join的查询

我已经尝试过EntityGraphs,用NamedQuery注释了我的存储库方法,尝试过将实体映射到一个或多个双向实体,但似乎没有任何效果

@Entity
@Table(name = "A_Master")
public class EntityA{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    private int userId;

    @OneToMany(cascade = CascadeType.PERSIST)
    @JoinColumn(name = "FK_reservationId")
    @Fetch(FetchMode.JOIN)
    private List<EntityB> bEntities= new ArrayList<>();

}

@Entity
@Table(name = "Entity_B")
public class EntityB{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;
    @OneToMany(cascade = CascadeType.PERSIST)
    @JoinColumn(name = "FK_journeyId")
    @Fetch(FetchMode.JOIN)
    private List<EntityC> cEntities = new ArrayList<>();
}

public interface ReservationRepository extends JpaRepository<EntityA, Integer>
{
    public List<EntityA> findByUserIdAndStatus(String userId);
}
@实体
@表(name=“A_Master”)
公共类实体{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
@列(name=“id”)
私人长id;
私有int用户id;
@OneToMany(cascade=CascadeType.PERSIST)
@JoinColumn(name=“FK_reservationId”)
@Fetch(FetchMode.JOIN)
private List benties=new ArrayList();
}
@实体
@表(name=“实体”B)
公共类实体B{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
@列(name=“id”)
私人长id;
@OneToMany(cascade=CascadeType.PERSIST)
@JoinColumn(name=“FK_journeyId”)
@Fetch(FetchMode.JOIN)
私有列表百分比=新的ArrayList();
}
公共接口ReservationRepository扩展了JpaRepository
{
公共列表findByUserIdAndStatus(字符串userId);
}

FetchType
定义如何加载集合。是立即加载还是延迟加载(按需加载)

相反,
FetchMode
定义了加载集合的机制。当您用以下标记您的收藏时:

@OneToMany(cascade = CascadeType.PERSIST)
@Fetch(FetchMode.JOIN)
这是无意义的,因为默认情况下OneToMany的
fetchType
是惰性的,但是不能在惰性集合上使用联接机制。若要加入,需要将其设置为“渴望”


hibernate中的默认FetchMode是SELECT,这是首选的FetchMode,因为它对于基于密钥的访问的缓存使用非常有效。我建议您将
FetchType.Lazy
FetchMode一起使用。选择
启用集合批处理

我使用了FetchType eager与FetchMode连接,但它不起作用。我需要这种组合,因为表有巨大的数据,我需要立即获取所有记录。无论我做什么,这种组合都不适用于数据JPA查询方法。我甚至用命名查询注释了我的JPARepository方法,显式地编写了一个SQL连接查询。即使这样也不行。@Navdeep您不能在第三级加入。启用查询批处理,以“从C中选择,其中id在……”结束。这里不是您需要的连接,而是“@Batch”注释OK,谢谢。我试试看。只是想知道:如果我的存储库中有一个findById方法,那么它就可以工作了。只触发一个查询。当我找到另一个专栏时,就会出现问题。