gpt4 book ai didi

java - 将规范转换为查询谓词

转载 作者:搜寻专家 更新时间:2023-11-01 03:56:57 25 4
gpt4 key购买 nike

我正试图找到一种基于 DDD“规范”查询数据库内容的优雅方式。

在领域驱动设计中,规范用于检查某个对象(也称为候选者)是否符合(领域特定的)要求。例如,规范“IsTaskDone”如下所示:

class IsTaskDone extends Specification<Task> {
boolean isSatisfiedBy(Task candidate) {
return candidate.isDone();
}
}

上述规范可用于多种用途,例如它可用于验证任务是否已完成,或从集合中过滤所有已完成的任务。 但是,我想重新使用这个很好的域相关规范来查询数据库。

当然,最简单的解决方案是从数据库中检索我们所需类型的所有实体,并通过循环和删除不匹配的实体来过滤内存中的列表。但很明显,这对于性能来说并不是最佳的,尤其是当我们数据库中的实体数量增加时。

提案

所以我的想法是创建一个“ConversionManager”,将我的规范转换为持久性技术特定标准,想想 JPA 谓词类。服务如下所示:

public interface JpaSpecificationConversionManager {
<T> Predicate getPredicateFor(Specification<T> specification, Root<T> root, CriteriaQuery<?> cq, CriteriaBuilder cb);
JpaSpecificationConversionManager registerConverter(JpaSpecificationConverter<?, ?> converter);
}

通过使用我们的管理器,用户可以注册自己的转换逻辑,将领域相关规范与持久性特定逻辑隔离开来。为了最小化我们管理器的配置,我想在我的转换器类上使用注释,允许管理器自动注册这些转换器。

然后,JPA 存储库实现可以使用我的管理器,通过依赖注入(inject),提供按规范查找的方法。按规范提供查找应该会大大减少我们存储库接口(interface)上的方法数量。

理论上,这一切听起来都不错,但我觉得我遗漏了一些关键的东西。大家觉得我的提议怎么样,符合DDD的思维方式吗?或者是否已经有一个框架可以做与我刚才描述的相同的事情?

最佳答案

Hades是一个存储库框架,作为 JPA 的包装器。它是 DDD 友好的。它支持 DDD Specifications盒子外面。我也建议你看看这篇来自InfoQ的文章.

关于java - 将规范转换为查询谓词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4547738/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com