用jpa写一个动态、集合嵌套查询代码
时间: 2023-06-13 11:04:37 浏览: 106
假设有两个实体类:Order(订单)和Item(订单项),一个订单包含多个订单项。
Order.java
```java
@Entity
@Table(name = "orders")
public class Order {
@Id
private Long id;
private String customerName;
@OneToMany(mappedBy = "order", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Item> items = new ArrayList<>();
// ... 省略其他属性和方法
}
```
Item.java
```java
@Entity
@Table(name = "items")
public class Item {
@Id
private Long id;
private String productName;
private Integer quantity;
@ManyToOne(fetch = FetchType.LAZY)
private Order order;
// ... 省略其他属性和方法
}
```
现在我们要查询所有订单中,订单项中商品名称包含指定关键字的订单。这个查询需要动态构建查询条件,同时需要对嵌套的集合进行查询。
可以使用 JPA 的 Criteria API 来实现:
```java
public List<Order> findOrdersByItemProductNameContains(String keyword) {
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Order> cq = cb.createQuery(Order.class);
Root<Order> root = cq.from(Order.class);
Join<Order, Item> itemJoin = root.join("items");
Predicate predicate = cb.like(itemJoin.get("productName"), "%" + keyword + "%");
cq.where(predicate).distinct(true);
return entityManager.createQuery(cq).getResultList();
}
```
这个方法会返回所有订单中,订单项中商品名称包含指定关键字的订单。其中 `root.join("items")` 表示关联查询 Order 和 Item,`itemJoin.get("productName")` 表示查询 Item 实体类中名为 productName 的属性,`Predicate` 表示查询条件。
阅读全文