我正在使用Spring Boot 1.5.6。特别是,我正在使用Spring Boot Data MongoDB连接到MongoDB。
假设我有这个MongoRepository
public interface MyRepository1 extends MongoRepository<MyDocumentClass<MyResult1>, String> {
}
第二个
public interface MyRepository2 extends MongoRepository<MyDocumentClass<MyResult2>, String> {
}
然后我有我的文件
@Document(collection = "collectionName")
public class MyDocumentClass<T extends AbstractResult> {
private String myString;
private int myInt;
private List<T> results;
public MyDocumentClass(String myString, int myInt, List<T> results) {
this.myString = myString;
this.myInt = myInt;
this.results = results;
}
public String getMyString() {
return myString;
}
public int getMyInt() {
return myInt;
}
public List<T> getResults() {
return results;
}
}
当然,AbstractResult
以及MyResult1
和MyResult2
扩展它。
以前,MyDocumentClass
不是通用的。然后代码工作正常。但是现在我想根据T
MyDocumentClass
中的内容选择一个不同的集合名称。这可能吗?如果是,如何?
如果已经找到了使用 MongoTemplates 的方法,但这不是我在这里寻找的。
由于Java的类型擦除,您无法执行此操作。泛型仅在编译类型上可见。因此,在运行时,JVM无法区分MyDocumentClass<MyResult1>
和MyDocumentClass<MyResult2>
。
但是,您可以将这些实例存储在同一个MongoRepository<MyDocumentClass, String>
中。
正如你所发现的,你可以使用MongoTemplate
来做到这一点,但问题不在于你怎么做,而是你应该这样做。我会说不;Java不是C++ -MyDocumentClass<MyResult1>
和MyDocumentClass<MyResult2>
不是不同的东西。Java 中的泛型只是一个编译时限定符。
区分MyResult1
和MyResult2
的方法不止一种,但最简单的方法可能是在MyDocumentClass
中添加类型。像这样:
public class MyDocumentClass {
private String type = "MyResult1 or MyResult2";
}