gpt4 book ai didi

java - 加入三个深度表时为"MultipleBagFetchException: cannot simultaneously fetch multiple bags"

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:06:00 31 4
gpt4 key购买 nike

org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags: [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 对象访问过滤后的子对象。并且关系类型应该是列表,而不是集合。

例如,order.getItems().get(0).getOptions.get(0)

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

最佳答案

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

  1. List 更改为 Set
  2. 使用 List 但不要取两个包。这意味着不要对两个集合都使用 fetchJoin()

过滤:

使用 where 条件集合将不会被过滤。集合将包含所有关联的对象。加入JPA是为了在根对象——Order上创造条件。它与 SQL 中的不同。

可以使用 JPA 2.1 JOIN ON 功能过滤关联的集合。这允许在 ON 子句中添加附加条件

参见示例 QueryDSL Left Join with additional conditions in ON

关于java - 加入三个深度表时为"MultipleBagFetchException: cannot simultaneously fetch multiple bags",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55326193/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com