你好专家@stackOverflow,

我们正在使用 Spring Data REST MongoDB。

是否可以预先加载子对象,而不是使用 @DBRef 注释的超链接?请引用下面的 Process.templates 属性。

这是我们的模型:

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<>();

这是我们的存储库:
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 提供指向子对象的链接
http://localhost:8080/data/process

带来以下 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"
        }
      }
    }, ...]
}

我什至尝试过 @DBRef(lazy=false) ,但没​​有运气。

提前致谢!

最佳答案

你有两种可能:

  • 将您的 MergeResult 存储在 Process 文档中(我不知道它是否适用于您的情况,但即使您有很多 MergeResult 也是最佳选择,因为 @DBRef 类似于 SQL 连接,而 MongoDB不是很好)
  • 使用 Excerpt

  • 使用摘录

    您可以通过以下步骤实现您的目标:

    1) 创建流程文档的投影
    @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)编辑您的存储库
    @RepositoryRestResource(excerptProjection = InlineTemplates.class)
    interface ProcessRepository extends CrudRepository<Process, String> {}
    

    3)去http://localhost:8080/data/process看结果

    注意: 我没有尝试代码,只是按照文档中的说明进行操作。对不起,如果它不起作用。

    10-07 20:30