Java Spring数据Mongodb存储库don';无法正确实现继承

Java Spring数据Mongodb存储库don';无法正确实现继承,java,spring,spring-data,spring-data-mongodb,Java,Spring,Spring Data,Spring Data Mongodb,具有两种类型的实体,映射到单个MongoDB集合中的两个Java类: @Document public class Superclass { ... } @Document(collection = "superclass") public class Subclass extends Superclass { ... } 这些实体有两个存储库: public interface SuperclassRepository extends MongoRepository<Supercla

具有两种类型的实体,映射到单个MongoDB集合中的两个Java类:

@Document
public class Superclass { ... }

@Document(collection = "superclass")
public class Subclass extends Superclass { ... }
这些实体有两个存储库:

public interface SuperclassRepository extends MongoRepository<Superclass, String> {}
public interface SubclassRepository extends MongoRepository<Subclass, String> {}
public接口超类存储库扩展了MongoRepository{}
公共接口子类存储扩展了MongoRepository{}
mongorespositions
无法正确处理实体的继承。查询所有
子类
对象(例如
subassrepository.findAll()
)时,结果集包含
超类
对象,这些对象被实例化(或至少尝试实例化)为属于
子类
的字段的空值,但不是
超类的一部分

预期的结果是
subassrepository
应该只返回
Subclass
对象,而
SuperclassRepository
应该返回
Superclass
Subclass
对象。它在Spring数据JPA中就是这样工作的


有没有人遇到过这个错误,并且有任何解决方法来修复它?

我也遇到了同样的问题

看看源代码,让我惊讶的是它没有实现。它会添加集合名称和实体类,但不会在最终查询中插入_class属性。 看了之后,我意识到Mongo是如何知道子类1或子类2是从超类派生出来的。 因此,我只需重写SimpleMongoRepository类,并创建自己的工厂,将该类而不是默认的SimpleMongoRepository放入其中

我补充说:

public MySimpleMongoRepository(MongoEntityInformation<T, ID> metadata, MongoOperations mongoOperations) {

    Assert.notNull(mongoOperations);
    Assert.notNull(metadata);

    this.entityInformation = metadata;
    this.mongoOperations = mongoOperations;
    Reflections reflections = new Reflections("com.cre8techlabs.entity");
    Set<String> subTypes = reflections.getSubTypesOf(entityInformation.getJavaType()).stream().map(Class::getName).collect(Collectors.toSet());
    subTypes.add(entityInformation.getJavaType().getName());
    this.baseClassQuery = Criteria.where("_class").in(subTypes.toArray());
}

这对我来说很管用,我只是担心我会遇到同样的问题

看看源代码,让我惊讶的是它没有实现。它会添加集合名称和实体类,但不会在最终查询中插入_class属性。 看了之后,我意识到Mongo是如何知道子类1或子类2是从超类派生出来的。 因此,我只需重写SimpleMongoRepository类,并创建自己的工厂,将该类而不是默认的SimpleMongoRepository放入其中

我补充说:

public MySimpleMongoRepository(MongoEntityInformation<T, ID> metadata, MongoOperations mongoOperations) {

    Assert.notNull(mongoOperations);
    Assert.notNull(metadata);

    this.entityInformation = metadata;
    this.mongoOperations = mongoOperations;
    Reflections reflections = new Reflections("com.cre8techlabs.entity");
    Set<String> subTypes = reflections.getSubTypesOf(entityInformation.getJavaType()).stream().map(Class::getName).collect(Collectors.toSet());
    subTypes.add(entityInformation.getJavaType().getName());
    this.baseClassQuery = Criteria.where("_class").in(subTypes.toArray());
}

它对我有效,我只是担心它需要更长的时间

我为那个bug创建了一个和。我为那个bug创建了一个和。理想是更改QueryMapper,但这意味着更改MongoTemplate理想是更改QueryMapper,但这意味着更改MongoTemplate