我想根据一些参数获取对象列表。对象是否属于特定类别,是否具有 xyz 属性等。我创建了一个相当简单的存储库,通过 id 获取对象。如果我想要一个基于不同参数和标准的对象列表,您是否会在存储库中添加一个执行此操作的方法,或者在服务层中添加一个持续运行的方法,直到它有一个符合标准的对象列表?它会简单地使用存储库 get by id 方法并根据许多标准检查它吗?
问问题
545 次
1 回答
2
以下策略基于该项目也使用域对象作为持久对象。
如果查询仅用于用户搜索(例如,订单搜索 ui),我想直接在接口组件中调用存储库。
@Controller
public class OrderAdminController {
@RequestMapping(........)
public String search(@ModelAttribute OrderCriteria criteria) {
PagedList<Order> orders = orderRepository.findBy(criteria);
//criteria contains dateWhenPlaced, customerNameLike, orderStatus matching and so on.
.......
}
}
如果查询包含领域概念,我想使用Specification。在这种情况下,SQL 过滤最终用于基础设施(为了性能,我们不能将所有聚合加载到内存中并通过 java 进行过滤)但域逻辑不会泄漏(到应用层和基础设施)
public class CancelOverdueOrdersBatch {
public void run() {
List<Order> overdues = orderRepository.
findSatisfying(new OverdueOrderSpecification(clock));
for (Order order: overdues) {
//.....cancel
}
}
}
public class OverdueOrderSpecification {
private Clock clock;
private int overdueMinutes = 30;
public OrderCriteria asCriteria() { //invoked by repository implementation
return new OrderCriteria.Builder().orderStatusEq(UNPAID).
placedBefore(overdueMinutesAgo()).build();
}
private Date overdueMinutesAgo() {
return ....//placedDate calculation based on clock.now() and overdueMinutes
}
}
于 2013-10-05T02:04:54.773 回答