【问题标题】:Spring Data JPA: Implementing Custom Repository Behavior with SpecificationsSpring Data JPA:使用规范实现自定义存储库行为
【发布时间】:2015-03-15 17:16:20
【问题描述】:

我想创建一个具有自定义行为的 Spring Data JPA 存储库,并使用 Specifications 实现该自定义行为。我已经通过Spring Data JPA documentation for implementing custom behavior in a single repository 进行了设置,但没有在自定义存储库中使用 Spring Data Specification 的示例。如果可能的话,如何做到这一点?

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

我没有使用 QueryDSL。谢谢。

【问题讨论】:

    标签: java spring jpa spring-data spring-data-jpa


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      这没有使用规范,所以不确定它是否与您相关,但我能够注入自定义行为的一种方法如下,

      1. 基本结构:如下

        我。为以通用父实体建模的实体类集创建通用接口。请注意,这是可选的。就我而言,我需要这种层次结构,但这不是必需的

        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
        }
        

        二。从通用(第 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
        }
        

        三。在您的服务实现类中使用上述存储库

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

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

          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
          
          }
          
        3. 具体实现类可以

          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;
               }
           }
          

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-10-06
        • 2016-12-30
        • 1970-01-01
        • 1970-01-01
        • 2017-03-26
        • 2021-04-01
        • 2012-05-18
        • 2012-06-02
        相关资源
        最近更新 更多