JPA(Java Persistence API)是Java EE平台的标准ORM(对象关系映射)框架,用于将Java对象持久化到关系型数据库中。双向实体关系是指两个实体类之间相互关联,例如一对多(One-to-Many)或多对多(Many-to-Many)关系。
在双向实体关系中,常见的类型包括:
双向实体关系广泛应用于各种业务场景,例如:
在实际应用中,有时我们只需要查询父实体及其部分子实体,而不是全部子实体。例如,查询一个订单及其部分订单项。
假设我们有两个实体类:Order
和OrderItem
,它们之间是一对多的关系。我们希望在查询订单时,只选择部分订单项。
@Entity
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToMany(mappedBy = "order", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private List<OrderItem> orderItems;
// getters and setters
}
@Entity
public class OrderItem {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
@JoinColumn(name = "order_id")
private Order order;
// getters and setters
}
我们可以使用JPQL(Java Persistence Query Language)或Criteria API来实现这一需求。
public List<Order> findOrderWithPartialItems(Long orderId, List<Long> itemIds) {
String jpql = "SELECT o FROM Order o JOIN FETCH o.orderItems oi WHERE o.id = :orderId AND oi.id IN :itemIds";
return entityManager.createQuery(jpql, Order.class)
.setParameter("orderId", orderId)
.setParameter("itemIds", itemIds)
.getResultList();
}
public List<Order> findOrderWithPartialItems(Long orderId, List<Long> itemIds) {
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Order> cq = cb.createQuery(Order.class);
Root<Order> order = cq.from(Order.class);
Join<Order, OrderItem> orderItem = order.join("orderItems");
Predicate orderIdPredicate = cb.equal(order.get("id"), orderId);
Predicate itemIdsPredicate = orderItem.get("id").in(itemIds);
cq.where(cb.and(orderIdPredicate, itemIdsPredicate));
return entityManager.createQuery(cq).getResultList();
}
通过上述方法,我们可以在查询父实体时仅选择子实体的子集,从而提高查询效率和数据处理的灵活性。
领取专属 10元无门槛券
手把手带您无忧上云