jpa2.2.10 使用entityManager构建sql查询,实体类和Dto中都有set<实体类>,leftjoin,Concat group set类型字段 写个详细的示例
时间: 2023-06-10 13:02:47 浏览: 219
好的,下面是一个使用JPA2.2.10进行SQL查询的示例:
```java
// 定义一个实体类
@Entity
@Table(name = "order")
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String product;
private Integer amount;
private LocalDate date;
@OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
private Set<OrderItem> orderItems;
// 省略getter/setter方法
}
@Entity
@Table(name = "order_item")
public class OrderItem {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
@JoinColumn(name = "order_id")
private Order order;
private String item;
private Integer quantity;
// 省略getter/setter方法
}
// 定义一个DTO类
public class OrderDTO {
private Long id;
private String product;
private LocalDate date;
private Set<String> items;
// 省略getter/setter方法
}
// 定义一个查询方法
public List<OrderDTO> findOrders(EntityManager entityManager) {
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<OrderDTO> query = criteriaBuilder.createQuery(OrderDTO.class);
Root<Order> orderRoot = query.from(Order.class);
Join<Order, OrderItem> orderItemJoin = orderRoot.join(Order_.orderItems, JoinType.LEFT);
Expression<String> itemsConcat = criteriaBuilder.function("GROUP_CONCAT", String.class, orderItemJoin.get(OrderItem_.item), criteriaBuilder.literal(";"));
Selection[] selections = new Selection[] {
orderRoot.get(Order_.id),
orderRoot.get(Order_.product),
orderRoot.get(Order_.date),
criteriaBuilder.function("GROUP_CONCAT", String.class,
orderItemJoin.get(OrderItem_.item), criteriaBuilder.literal(";"))
};
query.multiselect(selections)
.groupBy(orderRoot.get(Order_.id))
.orderBy(criteriaBuilder.desc(orderRoot.get(Order_.date)));
List<OrderDTO> result = entityManager.createQuery(query).getResultList();
return result;
}
```
在这个例子中,我们定义了一个`Order`实体类和一个`OrderItem`实体类,并且它们之间是一对多的关系(一个订单可以包含多个订单项)。我们还定义了一个`OrderDTO`数据传输对象,它的作用是将查询结果进行封装,只包含我们需要的字段。在查询方法`findOrders()`中,我们使用了`CriteriaBuilder`和`CriteriaQuery`来构建查询语句。我们使用`join`方法进行左连接,`groupBy`方法进行分组聚合,`orderBy`方法进行排序。其中,`itemsConcat`是一个用于连接多个订单项中的`item`字段的表达式。最后,我们使用`createQuery`方法执行查询,并将结果转换成`List<OrderDTO>`类型返回。
阅读全文