Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用于多个实体的通用JPA存储库_Java_Spring_Jpa_Spring Data - Fatal编程技术网

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
    是如何工作的

  • 有没有办法避免为每个实体编写这些存储库接口?比如说一个>通用存储库

    没有。不过,这也不是什么陈词滥调

  • MyQueryDescriptor类有一个方法返回 将被查询的实体。什么是一个干净的获取方法 基于实体类的相应存储库,避免切换 案子
  • 我想您可以在运行时使用,在运行时将
    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