猿问

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

org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.loader.MultipleBagFetchException: can can同时获取多个包: [Order.items, OrderItem.options];


以上是我在加入三个表时遇到的异常,如下所示。


OrderItemOption.java


@Entity

public 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


@Entity

public 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


@Entity

public 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)


我怎样才能实现这个目标?


呼啦一阵风
浏览 98回答 2
2回答

皈依舞

为了避免上述异常,有两种可能性:更改为或ListSet使用但不要拿两个袋子。这意味着不要在两个集合上使用。ListfetchJoin()滤波:使用不会筛选条件集合的位置。集合将包含所有关联的对象。加入 JPA 是为了在根对象 - 顺序上创建条件。它与SQL中不同。可以使用 JPA 2.1 功能来筛选关联的集合。这允许在子句中附加条件JOIN ONON

繁星点点滴滴

如果您确实无法使用 Set 而不是 List:家长.class@OneToMany(&nbsp; &nbsp; mappedBy = "parent",&nbsp; &nbsp; orphanRemoval = true,&nbsp; &nbsp; 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() {&nbsp; &nbsp; childs.removeAll(Collections.singleton(null));&nbsp; &nbsp; return childs;}
随时随地看视频慕课网APP

相关分类

Java
我要回答