当前位置: 首页 > 知识库问答 >
问题:

MultipleBagFetchException:无法同时提取多个行李

秋建义
2023-03-14

我有以下实体

注册程序

@Data
@NoArgsConstructor
@Entity
@EntityListeners(RegisteredProgramAuditListener.class)
public class RegisteredProgram extends Auditable<String> {

    @OneToMany(mappedBy = "registeredProgram", cascade = CascadeType.ALL)
    @JsonBackReference
    private List<Trainer> trainerList;

    @OneToMany(mappedBy = "registeredProgram", cascade = CascadeType.ALL)
    @JsonBackReference
    private List<Official> officialList;
}

教练

@Data
@NoArgsConstructor
@EntityListeners(TrainerAuditListener.class)
@Entity
public class Trainer extends Auditable<String> {

    @ManyToOne
    @JoinColumn(name = "REGISTERED_PROGRAM_ID", nullable = false)
    @JsonManagedReference
    private RegisteredProgram registeredProgram;

    @Type(type = "yes_no")
    private Boolean isDeleted = false;
}

官方

@Data
@NoArgsConstructor
@EntityListeners(OfficialAuditListener.class)
@Entity
public class Official extends Auditable<String> {

    @ManyToOne
    @JoinColumn(name = "REGISTERED_PROGRAM_ID", nullable = false)
    @JsonManagedReference
    private RegisteredProgram registeredProgram;

    @Type(type = "yes_no")
    private Boolean isDeleted = false;
}

基本上,我有与Register steredProgram(Trainer-Register steredProgram,官方注册程序)有多对一关系的实体。现在我有一个服务已经满足了我的要求,通过id获取注册程序,我应该只包含所有的Trainer官方与isDeletedfalse。请参阅下面的服务:

服务

@Override
public RegisteredProgramRequestDto getRegisteredProgramDto(Long id) {
    RegisteredProgram registeredProgram = registeredProgramRepository.getOne(id);
    RegisteredProgramRequestDto registeredProgramRequestDto = programRegistrationMapper
            .registeredProgramToRequestDto(registeredProgram);
    registeredProgramRequestDto.setOfficialDtoList(
            registeredProgramRequestDto.getOfficialDtoList()
                    .stream()
                    .filter(officialDto -> !officialDto.getIsDeleted())
                    .collect(Collectors.toList())
    );
    registeredProgramRequestDto.setTrainerDtoList(
            registeredProgramRequestDto.getTrainerDtoList()
                    .stream()
                    .filter(trainerDto -> !trainerDto.getIsDeleted())
                    .collect(Collectors.toList())
    );
    return registeredProgramRequestDto;
}

现在,我尝试使用< code>@Query和< code>@EntityGraph,这样我就可以只使用一个查询就获得想要的输出。

存储 库

@Repository
public interface RegisteredProgramRepository extends JpaRepository<RegisteredProgram, Long>, QuerydslPredicateExecutor<RegisteredProgram> {

    @Query("select rp from RegisteredProgram rp join rp.officialList rpos join rp.trainerList rpts where rp.id = :id and rpos.isDeleted = false and rpts.isDeleted = false")
    @EntityGraph(attributePaths = {"officialList", "trainerList"}, type = EntityGraph.EntityGraphType.LOAD)
    RegisteredProgram getByIdNotDeleted(@Param("id") Long id);
}

更新的服务

@Override
public RegisteredProgramRequestDto getRegisteredProgramDto(Long id) {
    RegisteredProgram registeredProgram = registeredProgramRepository.getByIdNotDeleted(id);
    return programRegistrationMapper
            .registeredProgramToRequestDto(registeredProgram);
}

但是在实现它之后,我遇到了以下错误:

org.hibernate.loader。MultipleBagFetchException:无法同时提取多个行李:[com.tesda8.region8.program.registration.model.entities.RegisteredProgram.officialList,com.testda8.registration.rodel.entitys.Registered program.trainerList]

我已经搜索了stackoverflow并遇到了这个问题,但我仍然无法让我的查询正确执行。我应该如何处理这件事有什么想法吗?

共有1个答案

谷梁淇
2023-03-14

解决MultipleBagFetchException的常规修复方法是更改Settyped上的 typed字段,如下所示:

...
public class RegisteredProgram extends Auditable<String> {

    @OneToMany(mappedBy = "registeredProgram", cascade = CascadeType.ALL)
    @JsonBackReference
    private Set<Trainer> trainerList = new HashSet<>();

    @OneToMany(mappedBy = "registeredProgram", cascade = CascadeType.ALL)
    @JsonBackReference
    private Set<Official> officialList = new HashSet<>();
    ...
}

有关更多详细信息,请参见:https://thorben-janssen.com/hibernate-tips-how-to-avoid-hibernates-multiplebagfetchexception/

注意:请记住等于hashcode用于Set数据结构并避免Lombok

 类似资料:
  • 我需要配置SpringJPA(EntityManager)Hibernate 如果我必须fetch=FetchType。如果必须fetch=FetchType,则延迟运行服务器成功 。急切运行服务器错误: I使用tomcat 7 由:org引起。springframework。豆。工厂BeanCreationException:创建名为“entityManagerFactory”的bean时出错,

  • 问题内容: Hibernate在创建SessionFactory时抛出此异常: org.hibernate.loader.MultipleBagFetchException:无法同时获取多个包 这是我的测试用例: Parent.java Child.java 这个问题怎么样?我能做什么? 编辑 好的,我的问题是另一个“父”实体在我的父内部,我的真实行为是这样的: Parent.java Anoth

  • 问题内容: 在创建时抛出此异常: 无法同时获取多个包 这是我的测试用例: Parent.java 这个问题怎么样?我能做什么? 编辑 好的,我的问题是另一个“父”实体在我的父内部,我的真实行为是这样的: Parent.java AnotherParent.java Hibernate不喜欢带有的两个集合FetchType.EAGER,但这似乎是一个错误,我没有做不寻常的事情… FetchType.

  • 问题内容: 以下是我的代码在这里,我使用多个列表从数据库中获取数据。从hql查询中获取数据时显示异常。 Pojo课 hmb.xml文件 HQL查询 我正在尝试以下查询从数据库中获取数据,但这显示了 如何解决此问题 问题答案: 这是一个非常常见的问题,所以我决定将答案变成一篇文章。 Hibernate不允许获取一个以上的包,因为这会生成Cartesian。 现在,您会发现很多答案,博客文章,视频或其

  • 无效数据访问设备别名:org.hibernate.loader.多个包取出异常:无法同时获取多个包: [订单项, 订单项选项]; 上面是我加入下面三个表时遇到的一个例外。 OrderItemOption.java 订单项.java 订单.java 这是我一次性加入它们的QueryDSL代码。 我想做的是获得包含过滤关系的order对象,这样我就可以通过Order对象访问过滤的子对象。并且关系的类型

  • 问题内容: 我们有一个项目,需要延迟加载实体的集合,但是在某些情况下,我们需要热切地加载它们。我们已经为实体添加了注释。在我们的存储库方法中,我们添加了一个“ javax.persistence.loadgraph”提示来热切加载上述注释中定义的4个属性。当我们调用该查询时,Hibernate抛出。 有趣的是,当我重新定义所有这些集合时,Hibernate 确实不 使用MultipleBagFet