SpringData MongoDB Repositories Запрос к нескольким полям во вложенном объекте - PullRequest
0 голосов
/ 22 января 2019

У меня проблемы с запросом к вложенному объекту с двумя параметрами.

Вот мой документ:

@Document(collection = "contracts")
public class Contract {
    @Id
    String _id;
    List<Stakeholder> stakeholders;
    Long contractRef;
}

Вот мой вложенный объект:

public class Stakeholder{
    String nationalId;
    String stakeholderRole;
}

Я использую mongoRepository для запроса этой коллекции:

public interface ContractRepository extends PagingAndSortingRepository<Contract, String> {
@Query( value = "{'countryBranchCode' : ?0, 'contractRef' : ?1, 'stakeholders' : {'nationalId' : ?2, 'stakeholderRole' : ?3} }",
        fields = "{'stakeholders.$.':1}")
Contract findStakeholderByContractRefAndNationalIdAndStakeholderRole
        (String countryBranchCode, Long contractRef, String nationalId, String stakeholderRole);

По сути, я хочу найти контракт с contractRef и заинтересованным лицом с соответствием как NationalId, так и стейкхолдера.

Я попробовал более простой запрос:

@Query( value = "{'countryBranchCode' : ?0, 'contractRef' : ?1, 'stakeholders.nationalId' : ?2, 'stakeholders.stakeholderRole' : ?3  }",
        fields = "{'stakeholders.$.':1}")
Contract findStakeholderByContractRefAndNationalIdAndStakeholderRole
        (String countryBranchCode, Long contractRef, String nationalId, String stakeholderRole);

Но это может вернуть контракт, у которого есть заинтересованная сторона с соответствующим национальным идентификатором и неправильной ролью, а другая заинтересованная сторона с неправильным национальным идентификатором и хорошей ролью, например, так что это не то, чего я хочу.

1 Ответ

0 голосов
/ 23 января 2019

Вы можете попробовать использовать $ elemMatch

@Query( value = "{'countryBranchCode' : ?0,'contractRef':?1,'stakeholders':{'$elemMatch':{'nationalId':?2,'stakeholderRole':?3}}}",
fields = "{'stakeholders.$.':1}")
Contract findStakeholderByContractRefAndStakeholderRoleAndNationalId (String countryBranchCode, Long contractRef,String stakeholderRole, String nationalId);
...