【发布时间】:2025-12-05 00:55:01
【问题描述】:
我必须找到销售了一些itemType 的销售人员。我创建了方法(见下文)。
但是客户告诉我他想找到最后销售的销售人员itemType。
数据库架构:
我的尝试:我们在表 ORDERS 日期列中,所以在普通 SQL 查询中我可以执行双子查询,它应该可以工作。
双重,因为我首先按日期排序,然后按销售员分组 - 返回的列表仅包含最后售出的物品。
SELECT *
FROM SALESMEN
JOIN
(SELECT *
FROM
(SELECT *
FROM ORDERS
ORDER BY ORDERS.date)
GROUP BY ORDERS.salesman_id) ON SALESMEN.id = ORDERS.salesman_id
WHERE ORDERS.item_type = "CAR"
很遗憾,queryDSL 只能在 IN 子句中进行子查询,而不能在 FROM 中。
我花了很多时间来寻找解决方案,在我看来,使用queryDSL 来获得排序和分组列表并在一个查询中将其与另一个表连接起来是根本不可能的。
但也许有经验的人有任何想法,也许解决方案比我想象的要简单:D
public List<SalesmanEntity> findSalesman(SalesmanSearchCriteriaTo criteria) {
SalesmanEntity salesmanEntity = Alias.alias(SalesmanEntity.class);
EntityPathBase<SalesmanEntity> alias = Alias.$(salesman);
JPAQuery<SalesmanEntity> query = new JPAQuery<SalesmanEntity>(getEntityManager()).from(alias);
... a lot of wird IF's....
if (criteria.getLastSoldItemTyp() != null) {
OrderEntity order = Alias.alias(OrderEntity.class);
EntityPathBase<OrderEntity> aliasOrder = Alias.$(order);
query.join(aliasOrder)
.on(Alias.$(salesman.getId()).eq(Alias.$(order.getSalesmanId())))
.where(Alias.$(order.getItemTyp()).eq(criteria.getLastSoldItemTyp()));
}
return query.fetch();
}
环境:
- Java 1.8
- SpringBoot 2.0.9
- 查询DSL 4.1.4
【问题讨论】: