Spring 数据Mongo: 如何return 嵌套对象的字段?
Spring Data Mongo: How to return nested object by its field?
我有域名:
class Company {
List<Job> jobs;
}
有没有办法从集合中 return 嵌套对象,例如:
@Repository
public interface CompanyRepository extends MongoRepository<Company, String>{
Job findByJobId(String jobId);
}
是的,这是可能的,试试这个:
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("*******************************************");
Checkout the Complete Project in my GitHub repository.
我必须对您的 Job
模型的结构做出一些假设,但假设是这样的:
public class Job {
private String id;
// other attributes and methods
}
... 并假设此模型嵌入到您的 Company
模型中,并且未在另一个集合中表示,您将必须通过 MongoTemplate
路径进行自定义实现。 Spring数据查询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.
}
}
您必须对基于嵌套对象字段的数据使用@Query 注释return。
@Repository public interface CompanyRepository extends MongoRepository<Company, String>{ @Query("{'jobs.$jobId' : ?0}") List<Job> findCompanyByJobId(String jobId);}
我有域名:
class Company {
List<Job> jobs;
}
有没有办法从集合中 return 嵌套对象,例如:
@Repository
public interface CompanyRepository extends MongoRepository<Company, String>{
Job findByJobId(String jobId);
}
是的,这是可能的,试试这个:
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("*******************************************");
Checkout the Complete Project in my GitHub repository.
我必须对您的 Job
模型的结构做出一些假设,但假设是这样的:
public class Job {
private String id;
// other attributes and methods
}
... 并假设此模型嵌入到您的 Company
模型中,并且未在另一个集合中表示,您将必须通过 MongoTemplate
路径进行自定义实现。 Spring数据查询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.
}
}
您必须对基于嵌套对象字段的数据使用@Query 注释return。
@Repository public interface CompanyRepository extends MongoRepository<Company, String>{ @Query("{'jobs.$jobId' : ?0}") List<Job> findCompanyByJobId(String jobId);}