Spring Data Mongo: как вернуть вложенный объект по его полю?

2

У меня есть домен:

class Company {
    List<Job> jobs;
}

Есть ли способ вернуть вложенный объект из коллекции, например:

@Repository
public interface CompanyRepository extends MongoRepository<Company, String>{
    Job findByJobId(String jobId);
}
  • 1
    Что касается документации репозитория Spring Mongo и даже описания базовой концепции Spring репозиториев данных, использование интерфейса Repository дает вам возможность работать с типом Doman в целом. Если вы хотите получить доступ к встроенному полю, я предлагаю использовать MongoOperations.
Теги:
spring
spring-data
spring-data-mongodb

2 ответа

0
Лучший ответ

Я должен сделать некоторые предположения о структуре вашей модели Job, но предполагая что-то вроде этого:

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

... и предполагая, что эта модель встроена в модель вашей Company и не представлена в другой коллекции, вам нужно будет выполнить пользовательскую реализацию через маршрут MongoTemplate. API запросов Spring Data не сможет определить, как получить то, что вы хотите, поэтому вы должны реализовать этот метод самостоятельно.

@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.
    }
}
4

Да, возможно, попробуйте следующее:

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.

  • 0
    Спасибо @ Санджай Рават. @ DBRef очень помог
  • 0
    Пожалуйста, сэр.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню