简体   繁体   English

Spring Data REST MongoDB:检索DBRef的对象而不是href

[英]Spring Data REST MongoDB: Retrieve objects of DBRef instead of href

Hello experts @ stackOverflow, 你好专家@ stackOverflow,

We are using Spring Data REST MongoDB. 我们正在使用Spring Data REST MongoDB。

Is it possible to eager load the child Objects, instead of Hyperlinks - which are annotated using @DBRef? 是否有可能急于加载子对象,而不是使用@DBRef注释的超链接? Please refer the Process.templates attribute below. 请参阅下面的Process.templates属性。

Here is our Model: 这是我们的模型:

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.DBRef;
import org.springframework.data.mongodb.core.mapping.Document;

import java.util.ArrayList;
import java.util.List;

@Document(collection = "process")
public class Process {
    @Id
    private String id;

    private String name;

    @DBRef ///////// ------> This is the corresponding attribute <------
    private List<MergeTemplate> templates = new ArrayList<>();

Here is our Repository: 这是我们的存储库:

import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.data.rest.core.annotation.RepositoryRestResource;

@RepositoryRestResource(collectionResourceRel = "process", path = "process")
public interface ProcessRepository extends MongoRepository<Process, String> {
}

FindAll API brings links to the child objects FindAll API带来了子对象的链接

http://localhost:8080/data/process

Brings the following JSON. 带来以下JSON。

{
  "_embedded" : {
    "process" : [ {
      "id" : "56d731b82b45ee21a0d2ab0a",
      "name" : "application-kit",
      "_links" : {
        ..., 
        /********** This is the attribute in question (templates) ************/
        "templates" : {
          "href" : "http://localhost:8080/data/process/56d731b82b45ee21a0d2ab0a/templates"
        }
      }
    }, ...]
}

I even tried @DBRef(lazy=false) , but there is no luck. 我甚至试过@DBRef(lazy=false) ,但没有运气。

Thanks in advance! 提前致谢!

You have two possibilities: 你有两种可能性:

  1. Store your MergeResult s in the Process documents (I don't know if it is applicable for your case, but it would be the best choice even if you have a lot of MergeResult s since @DBRef is something like a SQL join, and MongoDB isn't great at that) MergeResult存储在Process文档中(我不知道它是否适用于您的情况,但即使您有很多MergeResult ,它也是最佳选择,因为@DBRef类似于SQL连接和MongoDB)那不是很好)
  2. Use an Excerpt 使用摘录

Using an Excerpt 使用摘录

You can achieve your goal with the following steps: 您可以通过以下步骤实现目标:

1) Create a projection of your Process document 1)创建Process文档的投影

@Projection(name = "inlineTemplates", types = { Process.class }) 
interface InlineTemplates {

  String getId();

  String getName();

  // using getTemplates() inside a projection causes the information to be inlined
  List<MergeTemplate> getTemplates(); 
}

2) Edit your repository 2)编辑您的存储库

@RepositoryRestResource(excerptProjection = InlineTemplates.class)
interface ProcessRepository extends CrudRepository<Process, String> {}

3) Go to http://localhost:8080/data/process to see the result 3)转到http://localhost:8080/data/process查看结果

NOTE: I didn't try the code, just take the instructions from the documentation. 注意:我没有尝试代码,只需要从文档中获取说明。 Sorry if it doesn't work. 对不起,如果它不起作用。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM