Java 用于多个实体的通用JPA存储库
我有几个实体,并将存储库用于查询我的数据库。因此,我创建了一个通用类Java 用于多个实体的通用JPA存储库,java,spring,jpa,spring-data,Java,Spring,Jpa,Spring Data,我有几个实体,并将存储库用于查询我的数据库。因此,我创建了一个通用类SpecBuilder,以基于查询描述(MyQueryDescriptor)构建查询 ?您可以使用实体继承和使用(SpEL)对正确的实体进行存储库问题调用。就像我上次更新的一样 使用通用SpecBuilder是一种干净的设计吗 取决于清洁设计的标准。相同的MyQueryDescriptor是否适用于不同的实体?当然,它们有不同的属性,所以您需要问问自己,给定的MyQueryDescriptor是否会被错误地用于不兼容的实体,以
SpecBuilder
,以基于查询描述(MyQueryDescriptor
)构建查询
?您可以使用实体继承和使用(SpEL)对正确的实体进行存储库问题调用。就像我上次更新的一样 使用通用SpecBuilder是一种干净的设计吗 取决于清洁设计的标准。相同的
MyQueryDescriptor
是否适用于不同的实体?当然,它们有不同的属性,所以您需要问问自己,给定的MyQueryDescriptor
是否会被错误地用于不兼容的实体,以及您可以如何防止它。我们无法对此发表评论,因为我们不知道您的SpecBuilder
是如何工作的
有没有办法避免为每个实体编写这些存储库接口?比如说一个>通用存储库
没有。不过,这也不是什么陈词滥调
resolvableType
定义为crudepository
但是,如果我是你,我会考虑切换到使用JPA标准API,而不使用上面的<代码> JPasePcExpCaseExutoor 抽象。这可能会被证明是更自然的。Spring存储库的设计以存储库围绕给定的特定实体组织查询的思想为中心,而您的用例似乎正朝着相反的方向发展——动态地选择一个实体,然后找到一个适合的存储库,只是为了满足Spring的限制。在这方面,你似乎在与框架抗争。
我看到的“问题”是,对于一般回购而言,单独的实体可能不够相似。我想你可以得到一些基本的;像findAll()
,save(T)
等等,但是为什么不让细节留待推断呢?您可以让系统生成一些不错的东西,比如通过that和theOther(T that,T2 theOther)找到它代码>?我知道单次回购会让我失去使用推理搜索方法的灵活性,比如通过that和其他(T that,T2 theOther)
,但我的SpecBuilder
类应该能够创建我需要的所有条件查询。因此,为许多实体创建空存储库感觉开销很大。这对JpaSpecificationExecutor
有什么帮助?
public class Specs {
public static <T extends MyEntityIFace> Specification<T> myfind(final MyQueryDescriptor qDesc) {
return new Specification<T>() {
@Override
public Predicate toPredicate(Root<T> root,
CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
try {
return SpecBuilder.mySpec(root, criteriaQuery, criteriaBuilder, qDesc);
} catch (Exception e) {
...handle error...
}
}
};
}
}
public interface Entity1DAO extends Repository<Entity1,Long>,
JpaSpecificationExecutor {
}
public interface Entity2DAO extends Repository<Entity2,Long>,
JpaSpecificationExecutor {
}
Entity1.class => Entity1DAO
Entity2.class => Entity2DAO