存储库和服务层、QueryDSL 和 Spring 数据

Repository and Service layer, QueryDSL and Spring Data

我正在使用 Spring 数据和 QueryDSL,我面临着这样一种情况,我必须根据一个或多个条件检索一组项目。我的问题是:

我是否应该期望服务层为我的存储库提供谓词?

// Repository method
public void findFilteredItems(Predicate conditions);

或者我应该像这样在存储库中隔离 QueryDSL 内容吗?

// Repository method
public void findFilteredItems(List<ItemFilter> conditions);

我认为最干净的方法是List<ItemFilter>方法,否则服务层和数据层的依赖关系之间存在紧耦合。此外,您会在存储库接口定义中放置技术特定的依赖项。

但我会说这取决于您的应用程序。如果您正在处理一个小型应用程序(或微服务),其中存储库层永远不会与任何其他项目共享,那么将 Predicate 放在存储库的方法签名中没有任何问题。

我不知道您是如何创建 Predicate 对象的。如果您已经有一个将 ItemFilters 转换为 Predicates 的转换器,您可以轻松地将代码放入存储库并使 ItemFilter 成为存储库界面的一部分。