在使用Spring Data Mongo存储库时如何指定集合名称?

时间:2019-06-06 10:52:41

标签: spring-data spring-data-mongodb

我正在使用spring数据为我的应用程序获取数据。

版本库类使用mongo实体类,该类作为上游依赖项添加到我的项目中,这意味着我没有任何控件可以更改类的源代码。结果,我无法从@Document到我的mongo实体类使用org.springframework.data.mongodb.core.mapping注释。

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.repository.MongoRepository;

public interface DummyRepository extends MongoRepository<Dummy, String> {

    Page<Dummy> findAll(Pageable pageable);

}

在这里,我无法控制Dummy类的源代码,因此无法添加@Document来指定此类的集合名称

在使用DummyRepository查询mongo集合时如何指定集合名称

1 个答案:

答案 0 :(得分:1)

一种方法是使用@EnableMongoRepositories#repositoryFactoryBeanClass和自己的风格MongoRepsoitoryFactoryBean覆盖getEntityInformation(Class)。{br /> 不幸的是,代码中存在一个错误(DATAMONGO-2297),目前,您还需要自定义getTargetRepsoitory(RepositoryInformation),如下面的代码片段所示。

@Configuration
@EnableMongoRepositories(repositoryFactoryBeanClass = CustomRepoFactory.class)
class config extends AbstractMongoConfiguration {
  // ...
}

class CustomRepoFactory extends MongoRepositoryFactoryBean {

  public CustomRepoFactory(Class repositoryInterface) {
    super(repositoryInterface);
  }

  @Override
  protected RepositoryFactorySupport getFactoryInstance(MongoOperations operations) {

    return new MongoRepositoryFactory(operations) {

      @Override
      public <T, ID> MongoEntityInformation<T, ID> getEntityInformation(Class<T> domainClass) {

       return new MappingMongoEntityInformation(
            operations.getConverter().getMappingContext().getPersistentEntity(domainClass)) {

          @Override
          public String getCollectionName() {
            return "customize-as-you-wish";
          }
        };
      }

      @Override // you should not need this when DATAMONGO-2297 is resolved
      protected Object getTargetRepository(RepositoryInformation information) {

        MongoEntityInformation<?, Serializable> entityInformation = getEntityInformation(information.getDomainType());
        return getTargetRepositoryViaReflection(information, entityInformation, operations);
      }
    };
  }
}