过滤存储库或服务中的对象?

我想根据一些参数得到一个对象列表。 该对象是否属于特定类别,它是否具有属性xyz等。我创建了一个相当简单的存储库,通过id获取对象。 如果我想要一个基于不同参数和标准的对象列表,你会在存储库中添加一个方法,或者在服务层中有一个方法继续运行,直到它有一个符合标准的对象列表? 它只是使用存储库get by id方法并针对许多标准进行检查?

以下策略基于项目还将域对象用作持久对象。

如果查询仅用于用户搜索(例如,搜索ui的命令),我想直接在interfaces组件中调用存储库。

@Controller public class OrderAdminController { @RequestMapping(........) public String search(@ModelAttribute OrderCriteria criteria) { PagedList orders = orderRepository.findBy(criteria); //criteria contains dateWhenPlaced, customerNameLike, orderStatus matching and so on. ....... } } 

如果查询包含域概念,我想使用规范 。 在这种情况下,SQL filterting最终用于基础结构(为了性能,我们无法在内存中加载所有聚合并按java进行过滤)但域逻辑不会泄漏(到应用程序层和基础结构)

 public class CancelOverdueOrdersBatch { public void run() { List 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 } }