数据访问应用程序使用异常:异常错误:无法同时取多个行李:[订单项目,订单项目选项];
以上是我在连接三个表时遇到的一个异常。
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。
例如,可以使用以下命令来获取项目:
我怎样才能达到这个目标呢?
2条答案
按热度按时间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
fhg3lkii2#
如果你真的不能用Set代替List:
父类
子类别
并在Child表中创建一个名为“position”的列
如果你不能使用表中的其他列,那么你需要依次查询列表。或者使用子列的id和一个自定义的getter。