如何使用MongoRepository存储到不同的集合,具体取决于文档中的泛型类型



我正在使用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以及MyResult1MyResult2扩展它。

以前,MyDocumentClass不是通用的。然后代码工作正常。但是现在我想根据TMyDocumentClass中的内容选择一个不同的集合名称。这可能吗?如果是,如何?

如果已经找到了使用 MongoTemplates 的方法,但这不是我在这里寻找的。

由于Java的类型擦除,您无法执行此操作。泛型仅在编译类型上可见。因此,在运行时,JVM无法区分MyDocumentClass<MyResult1>MyDocumentClass<MyResult2>

但是,您可以将这些实例存储在同一个MongoRepository<MyDocumentClass, String>中。

正如你所发现的,你可以使用MongoTemplate来做到这一点,但问题不在于你怎么做,而是你应该这样做。我会说不;Java不是C++ -MyDocumentClass<MyResult1>MyDocumentClass<MyResult2>不是不同的东西。Java 中的泛型只是一个编译时限定符。

区分MyResult1MyResult2的方法不止一种,但最简单的方法可能是在MyDocumentClass中添加类型。像这样:

public class MyDocumentClass {
private String type = "MyResult1 or MyResult2";
}

最新更新