上記のOliver Gierkeの回答を使用して、 私は1つのエンティティに対して複数のコレクションを作成する必要があるプロジェクトに取り組んでいます。私はスプリングレポジトリを使いたいので、リポジトリを使用する前に使用するエンティティを指定する必要がありました。
このシステムでは、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());
}
を使用すると、コンフィギュレーション変数を使用する必要がある場合はそうでなければ、多分このようなものを使用することができますか? source
@Value("#{systemProperties['pop3.port'] ?: 25}")
ありがとう、私は@Documentアノテーションを認識しており、おそらくそれを使用して終了します。私は基本的に、実際のクラスから設定を外部化したかったのです。リンクしたJIRAの問題はネーミング戦略について話していますが、カスタム名の注釈を使用することを提案しています。 – Danish
'collection'属性はSpELをサポートしています。例えば、'#{#bean.someMethod(T(your.fully.qualified.Type)}} 'を使って他のSpring Bean上で任意のメソッドを呼び出してコレクション名を計算することができます。 'someMethod(Class > type)'メソッドを提供するコンポーネントを 'bean 'として登録しました。 –