【问题标题】:Spring Data Mongo: How to return nested object by its field?Spring Data Mongo:如何按其字段返回嵌套对象?
【发布时间】:2016-10-08 14:18:59
【问题描述】:

我有域名:

class Company {
    List<Job> jobs;
}

有没有办法从集合中返回嵌套对象:

@Repository
public interface CompanyRepository extends MongoRepository<Company, String>{
    Job findByJobId(String jobId);
}

【问题讨论】:

  • 关于 spring mongo 存储库文档甚至是 spring 数据存储库核心概念描述,使用 Repository 接口使您能够将域类型作为一个整体工作。如果你想访问嵌入式字段,我建议使用 MongoOperations。

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


【解决方案1】:

是的,有可能,试试这个:

Company.class

@Document
public class Company {

    @Id
    private String id;

    @Field("name")
    private String Name;

    @DBRef
    List<Job> job;

    // Getters and Setters
}

Job.class

@Document
public class Job {

    @Id
    private String id;

    @Field("name")
    private String name;

    // Getters and Setters
}

CompanyRepository.class

public interface CompanyRepository extends MongoRepository<Company, String> {

    Company findOneByJobId(String id);

    List<Company> findByJobId(String id);
}

JobRepository.class

public interface JobRepository extends MongoRepository<Job, String>{

    Job findOneByName(String name);

}

然后您可以@Autowire 存储库并调用方法:

Job java = new Job("Core Java Developer");
Job spring = new Job("Spring Web Developer");
Job cSharp = new Job("C# Developer");
Job dotNet = new Job(".Net Web Developer");
List<Job> allJobs = Arrays.asList(java,cSharp,spring, dotNet);
// Save All Jobs
jobRepository.save(allJobs);

// Create Companies
Company oracle = new Company("Oracle", Arrays.asList(java));
Company microsoft = new Company("Microsoft", Arrays.asList(cSharp, dotNet));
Company pivotal = new Company("Pivotal", Arrays.asList(java, spring));
// Save all companies
companyRepository.save(Arrays.asList(oracle,microsoft,pivotal));

// Find job by name - C#
Job cSharpJob = jobRepository.findOneByName("C# Developer");
System.out.println("*******************Found Job by Name************************");
System.out.println(cSharpJob);
System.out.println("*******************************************");

// Find One Company having Job with Job Id - C#
Company companyWithcSharpJob = companyRepository.findOneByJobId(cSharpJob.getId());
System.out.println("********************Company having C# Job found using Job Id: "+ cSharpJob.getId() +"***********************");
System.out.println(companyWithcSharpJob.getName());
System.out.println("*******************************************");

在我的 GitHub 存储库中查看 Complete Project

【讨论】:

  • 感谢@Sanjay Rawat。 @DBRef 帮了大忙
  • 你真的救了我!!!! @Field 帮了我很多。非常感谢朋友。
【解决方案2】:

我必须对您的Job 模型的结构做出一些假设,但假设是这样的:

public class Job {
    private String id;
    // other attributes and methods
}

... 并假设此模型嵌入在您的 Company 模型中,并且未在另一个集合中表示,您将不得不通过 MongoTemplate 路由进行自定义实现。 Spring Data 查询 API 将无法弄清楚如何获得您想要的,因此您必须自己实现该方法。

@Repository
public interface CompanyRepository extends CompanyOperations, MongoRepository<Company, String>{
} 

public interface CompanyOperations {
    Job findByJobId(String jobId);
}

public class CompanyRepositoryImpl implements CompanyOperations {
    @Autowired private MongoTemplate mongoTemplate;

    @Override
    public Job findByJobId(String jobId){
        Company company = mongoTemplate.findOne(new Query(Criteria.where("jobs.id").is(jobId)), Company.class);
        return company.getJobById(jobId); //implement this method in `Company` and save yourself some trouble.
    }
}

【讨论】:

    【解决方案3】:

    您必须使用@Query 注解根据嵌套对象字段返回数据。
    @Repository public interface CompanyRepository extends MongoRepository&lt;Company, String&gt;{ @Query("{'jobs.$jobId' : ?0}") List&lt;Job&gt; findCompanyByJobId(String jobId);}

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-04
      • 2015-12-06
      • 2019-05-13
      • 2015-11-22
      • 2017-01-06
      • 2020-05-21
      • 1970-01-01
      相关资源
      最近更新 更多