SAP Cloud SDK for Javascript:过滤扩展实体
SAP Cloud SDK for Javascript: Filter on Expanded Entities
我知道我正在重新打开一个旧的 (),但那是不久前的事了,它引用了 API 的 Java 版本,用于消耗 S/4 HANA 服务。
我正在针对 SuccessFactors OData API 测试 Java 脚本版本的 API,它确实能够对扩展实体执行过滤器,如下所示:
<API_HOST>/odata/v2/PerPerson?$filter=personalInfoNav/firstName eq 'MARCO'&$expand=personalInfoNav&$select=personalInfoNav/firstName, personalInfoNav/lastName&$top=20
翻译成 SDK,将是 (TypeScript):
const personList: Array<PerPerson> =
await PerPerson.requestBuilder().getAll().top(20)
.select(
PerPerson.DATE_OF_BIRTH,
PerPerson.PERSONAL_INFO_NAV.select(
PerPersonal.PERSON_ID_EXTERNAL,
PerPersonal.FIRST_NAME,
PerPersonal.LAST_NAME,
PerPersonal.GENDER
)
).filter(PerPersonal.FIRST_NAME.equals('MARCO'))
.execute({ destinationName: this.configService.get<string>('ACTIVE_DESTINATION') });
但是由于过滤器函数的类型不兼容,此代码无法编译,这里需要 "PerPerson" 类型而不是 "PerPersonal"。
我找不到任何相关信息。
考虑到普通的 OData 查询工作得很好,有人能够做到这一点吗?
更新:
我最初不明白 Successfactors 在协议之上提供了这个功能。我可以想到两种可能的解决方法:
- 使用
new Filter
,例如:
PerPerson.requestBuilder().getAll().top(20)
.select(
...
).filter(
new Filter('personalInfoNav/firstName', 'eq', 'MARCO')
)
...
- 如果这不起作用,您可以在请求生成器上调用
build
而不是 execute
,这会为您提供 ODataRequest
对象,您可以从中获取 URL,然后您必须手动操作。然后您应该能够使用 executeHttpRequest
函数针对目的地执行此自定义请求对象。
让我知道其中一项是否适合您!
原回答:
仅当两个实体之间的关系为 1:1 时,才可以对 OData v2 上的扩展实体进行过滤。如果代码如下所示:
PerPerson.requestBuilder().getAll().top(20)
.select(
PerPerson.DATE_OF_BIRTH,
PerPerson.PERSONAL_INFO_NAV.select(
PerPersonal.PERSON_ID_EXTERNAL,
PerPersonal.FIRST_NAME,
PerPersonal.LAST_NAME,
PerPersonal.GENDER
)
).filter(
PerPerson.PERSONAL_INFO_NAV.filter(
PerPersonal.FIRST_NAME.equals('MARCO')
))
...
但是,如果关系是 1:n,则无法进行过滤。
希望对您有所帮助!
我知道我正在重新打开一个旧的 (
我正在针对 SuccessFactors OData API 测试 Java 脚本版本的 API,它确实能够对扩展实体执行过滤器,如下所示:
<API_HOST>/odata/v2/PerPerson?$filter=personalInfoNav/firstName eq 'MARCO'&$expand=personalInfoNav&$select=personalInfoNav/firstName, personalInfoNav/lastName&$top=20
翻译成 SDK,将是 (TypeScript):
const personList: Array<PerPerson> =
await PerPerson.requestBuilder().getAll().top(20)
.select(
PerPerson.DATE_OF_BIRTH,
PerPerson.PERSONAL_INFO_NAV.select(
PerPersonal.PERSON_ID_EXTERNAL,
PerPersonal.FIRST_NAME,
PerPersonal.LAST_NAME,
PerPersonal.GENDER
)
).filter(PerPersonal.FIRST_NAME.equals('MARCO'))
.execute({ destinationName: this.configService.get<string>('ACTIVE_DESTINATION') });
但是由于过滤器函数的类型不兼容,此代码无法编译,这里需要 "PerPerson" 类型而不是 "PerPersonal"。 我找不到任何相关信息。
考虑到普通的 OData 查询工作得很好,有人能够做到这一点吗?
更新:
我最初不明白 Successfactors 在协议之上提供了这个功能。我可以想到两种可能的解决方法:
- 使用
new Filter
,例如:
PerPerson.requestBuilder().getAll().top(20)
.select(
...
).filter(
new Filter('personalInfoNav/firstName', 'eq', 'MARCO')
)
...
- 如果这不起作用,您可以在请求生成器上调用
build
而不是execute
,这会为您提供ODataRequest
对象,您可以从中获取 URL,然后您必须手动操作。然后您应该能够使用executeHttpRequest
函数针对目的地执行此自定义请求对象。
让我知道其中一项是否适合您!
原回答:
仅当两个实体之间的关系为 1:1 时,才可以对 OData v2 上的扩展实体进行过滤。如果代码如下所示:
PerPerson.requestBuilder().getAll().top(20)
.select(
PerPerson.DATE_OF_BIRTH,
PerPerson.PERSONAL_INFO_NAV.select(
PerPersonal.PERSON_ID_EXTERNAL,
PerPersonal.FIRST_NAME,
PerPersonal.LAST_NAME,
PerPersonal.GENDER
)
).filter(
PerPerson.PERSONAL_INFO_NAV.filter(
PerPersonal.FIRST_NAME.equals('MARCO')
))
...
但是,如果关系是 1:n,则无法进行过滤。
希望对您有所帮助!