jpa “多个行李提取异常:当连接三个深度表时,无法同时获取多个行李

bvk5enib  于 2022-11-14  发布在  其他
关注(0)|答案(2)|浏览(133)

数据访问应用程序使用异常:异常错误:无法同时取多个行李:[订单项目,订单项目选项];
以上是我在连接三个表时遇到的一个异常。
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;
}

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;
}

Order.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对象访问过滤的子对象。并且关系的类型应该是List,而不是Set。
例如,可以使用以下命令来获取项目:
我怎样才能达到这个目标呢?

lp0sw83n

lp0sw83n1#

要避免上述异常,有两种可能性:
1.将List更改为Set

1.使用List,但不要取两个包。这意味着不要在两个集合上都使用fetchJoin()
筛选:
使用where将不会筛选条件集合。集合将包含所有关联的对象。在JPA中联接用于在根对象- Order上创建条件。这与在SQL中不同。
可以使用JPA 2.1 JOIN ON功能筛选关联的集合。这允许在ON子句中使用附加条件
例如参见QueryDSL Left Join with additional conditions in ON

fhg3lkii

fhg3lkii2#

如果你真的不能用Set代替List:

父类

@OneToMany(
    mappedBy = "parent",
    orphanRemoval = true,
    cascade = { CascadeType.PERSIST, CascadeType.MERGE }
)
@OrderColumn(name = "position")
private List<Child> childs = new ArrayList<>();

子类别

@ManyToOne(fetch = FetchType.LAZY)
private Parent parent;

并在Child表中创建一个名为“position”的列

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;
}

相关问题