CDS OData Java服务com.sap.cds.NonUniqueResultException

2020-08-19 10:01发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


你好,

我是这个论坛的新手,也是SAP Cloud Foundry/CAP的新手。 我在任何地方都找不到以下问题的解决方案。

我已经使用CAP Java Maven原型创建了Odata Java服务,如下所述:https://cap.cloud.sap/docs/java/getting-started

除了将实体和服务分为两个文件以外,最终我将它们组合成一个cds文件:

服务服务{
 实体案例{
 密钥ID:整数;
 caseNumber:整数;
 描述:字符串;
 phase:字符串;
 }
 }
 

接下来,我创建了一个CaseImpl,它扩展了HashMap 并实现了生成的" Case"接口。 CaseImpl提供了所有四个属性,如下所示:

 public Integer getId(){
 return(Integer)get(ID);
 }

 public void setId(final Integer id){
 put(ID,id);
 }
 

因此,基本上,CaseImpl是一个HashMap,其中包含所有必要的String键/Object值组合。

然后,我添加了一个自定义事件处理程序,如此处所述: https://developers.sap.com/tutorials/cp-cap-java-custom-handler.html

它包含此方法:

 @On(事件= CdsService.EVENT_READ,实体=" service.Case")
 公共无效onReadCases(最终CdsReadEventContext上下文){

 context.setResult(caseDao.getCases());
 } 

... getCases()方法返回四个ID为1、2、3和4标识的CaseImpl实例的集合。

调用/odata/v4/service/Case

时,整个集合可以完美显示。

但是,在调用/odata/v4/service/Case(1)时,我希望仅看到ID = 1的Case,但得到:

 com.sap.cds.NonUniqueResultException:结果包含多个行
 在com.sap.cds.impl.ResultImpl.single(ResultImpl.java:90)〜[cds4j-core-1.8.0.jar:na]
 在com.sap.cds.adapter.odata.v4.processors.impl.ResultSetProcessor.toEntity(ResultSetProcessor.java:113)〜[cds-adapter-odata-v4-1.4.0.jar:na]
 在com.sap.cds.adapter.odata.v4.processors.impl.DataProvider.lambda $ processReadRequest $ 6(DataProvider.java:291)〜[cds-adapter-odata-v4-1.4.0.jar:na]
 在com.sap.cds.services.impl.runtime.CdsRuntimeImpl.runInRequestContext(CdsRuntimeImpl.java:158)〜[cds-services-impl-1.4.0.jar:na]
 在com.sap.cds.adapter.odata.v4.processors.impl.DataProvider.processReadRequest(DataProvider.java:276)〜[cds-adapter-odata-v4-1.4.0.jar:na]
 在com.sap.cds.adapter.odata.v4.processors.impl.DataProvider.processRequestsBasedOnMethods(DataProvider.java:110)〜[cds-adapter-odata-v4-1.4.0.jar:na]
 在com.sap.cds.adapter.odata.v4.processors.impl.DataProvider.lambda $ processChangesetRequest $ 0(DataProvider.java:88)〜[cds-adapter-odata-v4-1.4.0.jar:na]
 在com.sap.cds.adapter.odata.v4.handlers.ODataProcessorHandler.lambda $ runInReqContextIfNecessary $ 2(ODataProcessorHandler.java:812)〜[cds-adapter-odata-v4-1.4.0.jar:na]
 在com.sap.cds.services.impl.runtime.CdsRuntimeImpl.runInChangeSetContext(CdsRuntimeImpl.java:167)〜[cds-services-impl-1.4.0.jar:na]
 在com.sap.cds.adapter.odata.v4.handlers.ODataProcessorHandler.runInReqContextIfNecessary(ODataProcessorHandler.java:811)〜[cds-adapter-odata-v4-1.4.0.jar:na]
 在com.sap.cds.adapter.odata.v4.processors.impl.DataProvider.processChangesetRequest(DataProvider.java:94)〜[cds-adapter-odata-v4-1.4.0.jar:na]
 在com.sap.cds.adapter.odata.v4.processors.impl.GenericODataProcessor.readEntityInternal(GenericODataProcessor.java:410)〜[cds-adapter-odata-v4-1.4.0.jar:na]
 在com.sap.cds.adapter.odata.v4.processors.impl.GenericODataProcessor.readEntity(GenericODataProcessor.java:398)〜[cds-adapter-odata-v4-1.4.0.jar:na]
 在com.sap.cds.adapter.odata.v4.processors.impl.GenericODataProcessor.readEntity(GenericODataProcessor.java:130)〜[cds-adapter-odata-v4-1.4.0.jar:na]
 

(等,没有原因)

此外,在调用/odata/v4/service/Case?$ top = 2时,将显示所有四种情况。 好像过滤器被忽略了。

我做错了什么? CDS版本是1.4.0。

预先感谢,

问候

杰伊德

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


你好,

我是这个论坛的新手,也是SAP Cloud Foundry/CAP的新手。 我在任何地方都找不到以下问题的解决方案。

我已经使用CAP Java Maven原型创建了Odata Java服务,如下所述:https://cap.cloud.sap/docs/java/getting-started

除了将实体和服务分为两个文件以外,最终我将它们组合成一个cds文件:

服务服务{
 实体案例{
 密钥ID:整数;
 caseNumber:整数;
 描述:字符串;
 phase:字符串;
 }
 }
 

接下来,我创建了一个CaseImpl,它扩展了HashMap 并实现了生成的" Case"接口。 CaseImpl提供了所有四个属性,如下所示:

 public Integer getId(){
 return(Integer)get(ID);
 }

 public void setId(final Integer id){
 put(ID,id);
 }
 

因此,基本上,CaseImpl是一个HashMap,其中包含所有必要的String键/Object值组合。

然后,我添加了一个自定义事件处理程序,如此处所述: https://developers.sap.com/tutorials/cp-cap-java-custom-handler.html

它包含此方法:

 @On(事件= CdsService.EVENT_READ,实体=" service.Case")
 公共无效onReadCases(最终CdsReadEventContext上下文){

 context.setResult(caseDao.getCases());
 } 

... getCases()方法返回四个ID为1、2、3和4标识的CaseImpl实例的集合。

调用/odata/v4/service/Case

时,整个集合可以完美显示。

但是,在调用/odata/v4/service/Case(1)时,我希望仅看到ID = 1的Case,但得到:

 com.sap.cds.NonUniqueResultException:结果包含多个行
 在com.sap.cds.impl.ResultImpl.single(ResultImpl.java:90)〜[cds4j-core-1.8.0.jar:na]
 在com.sap.cds.adapter.odata.v4.processors.impl.ResultSetProcessor.toEntity(ResultSetProcessor.java:113)〜[cds-adapter-odata-v4-1.4.0.jar:na]
 在com.sap.cds.adapter.odata.v4.processors.impl.DataProvider.lambda $ processReadRequest $ 6(DataProvider.java:291)〜[cds-adapter-odata-v4-1.4.0.jar:na]
 在com.sap.cds.services.impl.runtime.CdsRuntimeImpl.runInRequestContext(CdsRuntimeImpl.java:158)〜[cds-services-impl-1.4.0.jar:na]
 在com.sap.cds.adapter.odata.v4.processors.impl.DataProvider.processReadRequest(DataProvider.java:276)〜[cds-adapter-odata-v4-1.4.0.jar:na]
 在com.sap.cds.adapter.odata.v4.processors.impl.DataProvider.processRequestsBasedOnMethods(DataProvider.java:110)〜[cds-adapter-odata-v4-1.4.0.jar:na]
 在com.sap.cds.adapter.odata.v4.processors.impl.DataProvider.lambda $ processChangesetRequest $ 0(DataProvider.java:88)〜[cds-adapter-odata-v4-1.4.0.jar:na]
 在com.sap.cds.adapter.odata.v4.handlers.ODataProcessorHandler.lambda $ runInReqContextIfNecessary $ 2(ODataProcessorHandler.java:812)〜[cds-adapter-odata-v4-1.4.0.jar:na]
 在com.sap.cds.services.impl.runtime.CdsRuntimeImpl.runInChangeSetContext(CdsRuntimeImpl.java:167)〜[cds-services-impl-1.4.0.jar:na]
 在com.sap.cds.adapter.odata.v4.handlers.ODataProcessorHandler.runInReqContextIfNecessary(ODataProcessorHandler.java:811)〜[cds-adapter-odata-v4-1.4.0.jar:na]
 在com.sap.cds.adapter.odata.v4.processors.impl.DataProvider.processChangesetRequest(DataProvider.java:94)〜[cds-adapter-odata-v4-1.4.0.jar:na]
 在com.sap.cds.adapter.odata.v4.processors.impl.GenericODataProcessor.readEntityInternal(GenericODataProcessor.java:410)〜[cds-adapter-odata-v4-1.4.0.jar:na]
 在com.sap.cds.adapter.odata.v4.processors.impl.GenericODataProcessor.readEntity(GenericODataProcessor.java:398)〜[cds-adapter-odata-v4-1.4.0.jar:na]
 在com.sap.cds.adapter.odata.v4.processors.impl.GenericODataProcessor.readEntity(GenericODataProcessor.java:130)〜[cds-adapter-odata-v4-1.4.0.jar:na]
 

(等,没有原因)

此外,在调用/odata/v4/service/Case?$ top = 2时,将显示所有四种情况。 好像过滤器被忽略了。

我做错了什么? CDS版本是1.4.0。

预先感谢,

问候

杰伊德

付费偷看设置
发送
2条回答
半个程序猿
1楼-- · 2020-08-19 11:04

好吧,男孩遇到了世界,我知道我们现在做错了。

在实现@On句柄时,显然CDS希望您提供所需的内容。 我以为我们可以提供整个实体集合(案例),而CDS可以为我们做任何适合的事情。

只要CDS可以从数据库中检索数据,它就可以做到这一点。

问题是,我们需要能够向客户端提供最新的案例,然后从后端检索这些案例。 不是那些缓存在数据库中的。

我们通过删除@On句柄并创建一个@Before句柄来解决我们的问题,在该句柄中,我们从数据库中删除了所有Cases,并插入了最新版本。 然后CDS会处理这些案件,并为我们做任何必要的过滤。

 @Before(事件= CdsService.EVENT_READ,实体=" service.Case")
 公共无效beforeReadCases(最终CdsReadEventContext上下文){

 最终的CdsService服务= context.getService();

//从数据库中删除所有案例
 最后的CqnDelete delete = Delete.from(" service.Case");
 service.run(删除);

//将新案例放入数据库
 最后的CqnInsert insert = Insert.into(" service.Case")。entries(caseDao.getCases());
 service.run(插入);
 }
 
CJones
2楼-- · 2020-08-19 10:44

格雷戈·沃尔夫 Maximilian Streifeneder 你们也许会认出这样的东西吗?

一周热门 更多>