Выполните фильтр для расширенного объекта с помощью SAP Cloud SDK - PullRequest
1 голос
/ 15 мая 2019

Так что это может быть легко, но я почему-то не могу обернуть голову вокруг этого.Я пытаюсь найти делового партнера по его адресу электронной почты, используя SAP Cloud SDK.

Это то, что у меня есть:

final List<BusinessPartner> businessPartners = new DefaultBusinessPartnerService()
                        .getAllBusinessPartner()
                        .select(BusinessPartner.BUSINESS_PARTNER,
                                BusinessPartner.TO_BUSINESS_PARTNER_ADDRESS
                                        .select(BusinessPartnerAddress.TO_EMAIL_ADDRESS
                                                .select(AddressEmailAddress.SEARCH_EMAIL_ADDRESS)))
                        .filter(AddressEmailAddress.SEARCH_EMAIL_ADDRESS.eq(email)) //something like this?
                        .top(10)
                        .execute();

Теперь, как я могу выполнитьоперация фильтрации на расширенном объекте AddressEmailAddress?Тот, который я придумал, явно нет.У меня проблемы с переходом к расширенному объекту с использованием свободного API.

Есть идеи?

1 Ответ

1 голос
/ 16 мая 2019

Так как мое предложение сработало для вас. Позвольте мне перефразировать комментарий как ответ.

К сожалению, невозможно фильтровать в расширенных объектах для конечных точек службы SAP OData V2. Резервной стратегией будет прямой запрос «отфильтрованного» элемента в коллекции сущностей ( leaf ) и выполнение дополнительных запросов OData для перехода к исходной сущности ( root ).

В вашем случае я бы порекомендовал запросить непосредственно для AddressEmailAddress, чтобы разрешить BusinessPartnerAddress с помощью AddressId . Следующим шагом будет разрешение BusinessPartner с помощью поля businessPartner , например,

public List<BusinessPartner> getBusinessPartnersByEmail(
    @Nonnull BusinessPartnerService service,
    @Nonnull String email
)
    throws ODataException
{
    List<AddressEmailAddress> emailAddresses = service
        .getAllAddressEmailAddress()
        .filter(AddressEmailAddress.SEARCH_EMAIL_ADDRESS.eq(email))
        .execute();

    List<BusinessPartnerAddress> addresses = new LinkedList<>();
    for( AddressEmailAddress emailAddress : emailAddresses ) {
        addresses.addAll(
            service
                .getAllBusinessPartnerAddress()
                .filter(BusinessPartnerAddress.ADDRESS_ID.eq(emailAddress.getAddressID()))
                .execute());
    }

    List<BusinessPartner> businessPartners = new LinkedList<>();
    for( BusinessPartnerAddress address : addresses ) {
        businessPartners.add(service.getBusinessPartnerByKey(address.getBusinessPartner()).execute());
    }

    return businessPartners;
}
...