为了账号安全,请及时绑定邮箱和手机立即绑定

“多袋取料异常:不能同时取多袋”加入三深度表

“多袋取料异常:不能同时取多袋”加入三深度表

呼啦一阵风 2022-09-01 16:23:50
org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.loader.MultipleBagFetchException: can can同时获取多个包: [Order.items, OrderItem.options];以上是我在加入三个表时遇到的异常,如下所示。OrderItemOption.java@Entitypublic class OrderItemOption {  @Id  @GeneratedValue(strategy = GenerationType.IDENTITY)  @Column(name = "item_option_id")  private Long id;  @Column(name = "item_id", nullable = false)  private Long itemId;  @ManyToOne(fetch = FetchType.LAZY)  @JoinColumn(      name = "item_id",      referencedColumnName = "item_id",      insertable = false,      updatable = false  )  private OrderItem orderItem;}订单项.java@Entitypublic class OrderItem {  @Id  @GeneratedValue(strategy = GenerationType.IDENTITY)  @Column(name = "item_id")  private Long id;  @Column(name = "order_id", nullable = false)  private Long orderId;  @ManyToOne(fetch = FetchType.LAZY)  @JoinColumn(      name = "order_id",      referencedColumnName = "order_id",      insertable = false,      updatable = false,      nullable = false  )  private Order order;  @OneToMany(fetch = FetchType.LAZY, mappedBy = "orderItem")  @OrderBy("item_option_id ASC")  private List<OrderItemOption> options;}订购.java@Entitypublic class Order {  @Id  @Column(name = "order_id", nullable = false)  private Long id;  @OneToMany(fetch = FetchType.LAZY, mappedBy = "order")  @OrderBy("item_id ASC")  private List<OrderItem> items;}这是我的QueryDSL代码,可以一次加入它们。final QOrder order = QOrder.order;final QOrderItem item = QOrderItem.orderItem;final QOrderItemOption option = QOrderItemOption.orderItemOption;from(order).leftJoin(order.items, item).fetchJoin().leftJoin(item.options, option).fetchJoin().where(    order.id.eq(orderId)        .and(item.id.in(itemIds))        .and(option.id.in(optionIds))).fetchOne())我试图做的是获取包含过滤关系的Order对象,以便我可以通过订单对象访问过滤的子级。关系的类型应该是列表,而不是集合。例如,order.getItems().get(0).getOptions.get(0)我怎样才能实现这个目标?
查看完整描述

2 回答

?
皈依舞

TA贡献1851条经验 获得超3个赞

为了避免上述异常,有两种可能性:

  1. 更改为
    ListSet

  2. 使用但不要拿两个袋子。这意味着不要在两个集合上使用。ListfetchJoin()

滤波:

使用不会筛选条件集合的位置。集合将包含所有关联的对象。加入 JPA 是为了在根对象 - 顺序上创建条件。它与SQL中不同。

可以使用 JPA 2.1 功能来筛选关联的集合。这允许在子句中附加条件JOIN ONON


查看完整回答
反对 回复 2022-09-01
?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

如果您确实无法使用 Set 而不是 List:


家长.class


@OneToMany(

    mappedBy = "parent",

    orphanRemoval = true,

    cascade = { CascadeType.PERSIST, CascadeType.MERGE }

)

@OrderColumn(name = "position")

private List<Child> childs = new ArrayList<>();

儿童.class


@ManyToOne(fetch = FetchType.LAZY)

private Parent parent;

并在孩子的表格中创建一个名为“位置”的列


ALTER TABLE child ADD COLUMN position integer NOT NULL default 0

如果不能在表中使用其他列,则需要按顺序查询列表。或者使用子级的 id 和自定义 getter。


@OrderColumn(name = "id_child", updatable = false, insertable = false)


public List<Child> getChilds() {

    childs.removeAll(Collections.singleton(null));

    return childs;

}


查看完整回答
反对 回复 2022-09-01
  • 2 回答
  • 0 关注
  • 94 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信