如何根据文档中的泛型类型,使用MongoRepository存储到不同的集合

时间:2017-08-25 11:10:43

标签: java mongodb spring-boot java-8 spring-data-mongodb

我正在使用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的内容选择不同的集合名称。那可能吗?如果是,怎么样?

如果已找到a way using MongoTemplates,但这不是我在这里寻找的。

2 个答案:

答案 0 :(得分:1)

由于java Type erasure,你不能这样做。泛型只在编译类型中可见。因此,在运行时,JVM无法区分MyDocumentClass<MyResult1>MyDocumentClass<MyResult2>

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

答案 1 :(得分:1)

正如您所发现的那样,您可以使用MongoTemplate来完成,但问题不在于您是如何做到的;你应该这样做吗?我不说; Java不是C ++ - MyDocumentClass<MyResult1>MyDocumentClass<MyResult2>并不是不同的东西。 Java中的泛型仅仅是编译时限定符。

有多种方法可以区分MyResult1MyResult2,但最简单的方法可能是在MyDocumentClass中添加类型。类似的东西:

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