我正在使用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
的内容选择不同的集合名称。那可能吗?如果是,怎么样?
如果已找到a way using MongoTemplates,但这不是我在这里寻找的。 p>
答案 0 :(得分:1)
由于java Type erasure,你不能这样做。泛型只在编译类型中可见。因此,在运行时,JVM无法区分MyDocumentClass<MyResult1>
和MyDocumentClass<MyResult2>
。
但是,您可以将这些实例存储在同一MongoRepository<MyDocumentClass, String>
。
答案 1 :(得分:1)
正如您所发现的那样,您可以使用MongoTemplate
来完成,但问题不在于您是如何做到的;你应该这样做吗?我不说; Java不是C ++ - MyDocumentClass<MyResult1>
和MyDocumentClass<MyResult2>
并不是不同的东西。 Java中的泛型仅仅是编译时限定符。
有多种方法可以区分MyResult1
和MyResult2
,但最简单的方法可能是在MyDocumentClass
中添加类型。类似的东西:
public class MyDocumentClass {
private String type = "MyResult1 or MyResult2";
}