Spring Data JPA:使用规范实现自定义存储库行为

我想创建一个具有自定义行为的Spring Data JPA存储库,并使用规范实现该自定义行为。 除了在自定义存储库中没有使用Spring Data Specification的示例之外,我已经通过Spring Data JPA文档在单个存储库中实现自定义行为进行设置。 如果可能的话,如何做到这一点?

我没有看到一种方法将注入的东西注入需要规范的自定义实现中。 我认为我会很棘手,并将库的CRUD存储库部分注入到自定义部分,但这会导致循环实例化依赖关系。

我没有使用QueryDSL。 谢谢。


我想灵感的主要来源可能是SimpleJpaRepository如何处理规范。 要看的关键点是:

  • SimpleJpaRepository.getQuery(…) - 它基本上是创建一个CriteriaQuery并使用JPA Root引导一个选择。 后者是否适用于您的用例已经由您决定。 我认为前者肯定会适用。
  • SimpleJpaRepository.applySpecificationToCriteria(…) - 它基本上使用getQuery(…) (即RootCriteriaQuery )中产生的工件,并将给定的Specification应用于这些工件。

  • 这不是使用规范,所以不知道它是否与你有关,但我能够注入自定义行为的一种方式如下,

  • 基本结构如下

    一世。 为在泛型父实体之后建模的实体类集创建通用接口。 请注意,这是可选的。 在我的情况下,我需要这个层次结构,但没有必要

    public interface GenericRepository<T> {
    
    // add any common methods to your entity hierarchy objects, 
    // so that you don't have to repeat them in each of the children entities
    // since you will be extending from this interface
    }
    

    II。 从通用(步骤1)和JPARepository扩展特定存储库为

    public interface MySpecificEntityRepository extends GenericRepository<MySpecificEntity>, JpaRepository<MySpecificEntity, Long> {
    
    // add all methods based on column names, entity graphs or JPQL that you would like to 
    // have here in addition to what's offered by JpaRepository
    }
    

    III。 在服务实现类中使用上述存储库

  • 现在,Service类可能看起来像这样,

    public interface GenericService<T extends GenericEntity, ID extends Serializable> {
       // add specific methods you want to extend to user
    }
    
  • 通用实现类可以如下所示,

    public abstract class GenericServiceImpl<T extends GenericEntity, J extends JpaRepository<T, Long> & GenericRepository<T>> implements GenericService<T, Long> {
    
    // constructor takes in specific repository
        public GenericServiceImpl(J genericRepository) {
           // save this to local var
        } 
      // using the above repository, specific methods are programmed
    
    }
    
  • 具体的实现类可以

    public class MySpecificEntityServiceImpl extends GenericServiceImpl<MySpecificEntity, MySpecificEntityRepository> implements MySpecificEntityService {
    
        // the specific repository is autowired
        @Autowired
        public MySpecificEntityServiceImpl(MySpecificEntityRepository genericRepository) {
             super(genericRepository);
             this.genericRepository = (MySpecificEntityRepository) genericRepository;
         }
     }
    
  • 链接地址: http://www.djcxy.com/p/44089.html

    上一篇: Spring Data JPA: Implementing Custom Repository Behavior with Specifications

    下一篇: Tenancy with Spring Data JPA+Hibernate