使用上面Oliver Gierke的答案,在一个需要为一个实体创建多个集合的项目上,我想使用弹簧存储库,并且需要在使用存储库之前指定要使用的实体。
我设法使用此系统按需修改存储库集合名称,它使用SPeL。不过,您一次只能处理 1 个集合。
域对象
@Document(collection = "#{personRepository.getCollectionName()}")
public class Person{}
默认的弹簧存储库:
public interface PersonRepository
extends MongoRepository<Person, String>, PersonRepositoryCustom{
}
自定义存储库接口:
public interface PersonRepositoryCustom {
String getCollectionName();
void setCollectionName(String collectionName);
}
实现:
public class PersonRepositoryImpl implements PersonRepositoryCustom {
private static String collectionName = "Person";
@Override
public String getCollectionName() {
return collectionName;
}
@Override
public void setCollectionName(String collectionName) {
this.collectionName = collectionName;
}
}
要使用它:
@Autowired
PersonRepository personRepository;
public void testRetrievePeopleFrom2SeparateCollectionsWithSpringRepo(){
List<Person> people = new ArrayList<>();
personRepository.setCollectionName("collectionA");
people.addAll(personRepository.findAll());
personDocumentRepository.setCollectionName("collectionB");
people.addAll(personRepository.findAll());
Assert.assertEquals(4, people.size());
}
否则,如果您需要使用配置变量,则可以使用类似这样的东西?源
@Value("#{systemProperties['pop3.port'] ?: 25}")