当前位置: 首页 > 面试题库 >

Spring Data Mongodb-用于收集不同类型的存储库

单于帅
2023-03-14
问题内容

我有一个mongo集合,其中可能包含我映射到Java类型的三种类型的实体:

  • 节点
  • LeafType1
  • LeafType2

收集是使用父条目中的子节点的dbRefs存储树状结构。

我没有在Spring参考文档中找到有关主题的任何信息,所以我在这里问:有没有一种方法可以使用Repository机制来处理可能包含不同类型对象的集合?

在一个集合中声明多个用于不同类型的存储库似乎不是一个好主意,因为我经常遇到以下情况:查询的对象不是预期类型,并且为抽象类创建一个所有可能的类型继承都不起作用的存储库。

为了说明我的意思:

/**
 * This seems not safe
 */
public interface NodeRepository extends MongoRepository<Node, String> { }
public interface LeafType1Repository extends MongoRepository<LeafType1, String> { }
public interface LeafType2Repository extends MongoRepository<LeafType2, String> { }

/**
 * This doesn't work at all
 */
public interface MyCollectionRepository extends MongoRepository<AbstractMyCollectionNode, String> { }

问题答案:

如果Node \ LeafType1 \
LeafType2是AbstractMyCollectionNode的子类,那么事情将会很容易。只需像编写时那样声明存储库:

public interface MyCollectionRepository extends MongoRepository<AbstractMyCollectionNode, String> { }

我们已经在一个项目中做到了这一点,并且效果很好。Spring Data将在mongodb集合中的文档中添加一个名为“
_class”的属性,以便可以指出要实例化的类。

存储在一个集合中的文档可能有一些相似之处,也许您可​​以为它们提取一个通用类。

以下是从我们的项目之一复制的一些代码:

实体:

public abstract class Document {
    private String id;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }
    ....
public class WebClipDocument extends Document {
    private String digest;
    ...

仓库:

public interface DocumentDao extends MongoRepository<Document, String>{
...

并且 ,如果您的mongodb集合中的文档不具有“
_class”属性。您可以使用Converter:

在存储和查询对象时,让MongoConverter实例处理所有Java类型到DBObjects的映射很方便。但是,有时您可能希望MongoConverter完成大部分工作,但允许您有选择地处理特定类型的转换或优化性能。



 类似资料:
  • 问题内容: 我想将元素存储在一个列表中,每个元素具有4个参数,我试图创建一个数组列表,该列表为每个元素存储4个参数,它们是不同类型的: iD:int x位置:浮点 y位置:浮点 名称:字符串 我用: 但是当我使用时: 我得到错误: “ ArrayList类型的add(int,Object)方法不适用于参数(in,float,float)” 我不知道如何能够向ArrayList添加不同类型,有没有办

  • 我正在尝试构建一个CI流程,使用Travis CI从github自动将发布工件上传到Maven Central(Sonatype)。基本上,一切都很好,除了在最后;我从maven deploy命令中获得了两个不同的Nexus存储库:一个用于pom和jar;第二个是源代码、javadoc和签名。 我的猜测是,由于中间的元数据上传,他创建了两个存储库: 还我不明白为什么,以及如何修复它。 我的pom。

  • 我有一个这样的 txt 文件 163钱滴24 454快乐112 45 没有你什么都没有 56 第一个数字是歌曲的id,我想将其存储为整数,第二个数字是字符串!这不是一个词!第三个是整数,它是歌曲的点赞数。我想将它们存储在一个数组中,但当我使用scanner方法时,我会逐字存储它们,当歌曲有名字时 有什么方法可以读取 txt 文件,将第一个数字存储为 int,然后扫描整个字符串(歌曲名称),直到下一

  • 我知道重载是在编译时决定的,但当我试图运行下面的示例时,它给出了我无法理解的结果 当我每次运行这个代码片段时,我都会得到“Collection”的输出,这意味着调用参数为Collection的classify方法。 请解释

  • 问题内容: 在Swift编程语言中,它说“一个数组在一个有序列表中存储相同类型的多个值”。但是我发现您可以在数组中存储多种类型的值。描述不正确吗? 例如 问题答案: 来自REPL 您可以看到的是,这是或 发生的事情是提供了将数字和布尔值转换为的能力。需要编译代码时,编译器将执行转换。 因此,它们现在具有的通用类型,因此可以推断为 没有,您的代码将无法在REPL中编译。 但是你可以做到 因为它们具有

  • 问题内容: 我正在尝试开发一种通用的表加载器,其架构在运行时是已知的。这需要具有包含不同类型的元素的列表,并支持各种get和诸如集方法的类,,。元素我考虑的类型有,,,和,和。每个元素的实际类型在运行时都是已知的,我将它们存储在一个List中,描述其架构以进行进一步处理。 我的问题是:我应该在或中存储这样的元素列表吗?还是有更好的方法来实现此类? 问题答案: 由于您的类的共同祖先是,并且由于不会使