通常有两种方式通过OData来暴露SAP HANA中的数据库对象,一是直接使用Database Object,比如前一篇和本篇文章介绍的例子,这种方式针对于数据已经存在于SAP HANA中,在Repository中没有对应的设计时对象(Design-time Object);另一种方式是通过暴露repository中的设计时对象(Design-time Object),这是推荐使用的方式,因为这种方式的优点在于如果Design-time Object变化的话,OData服务会自动更新,如果是直接使用Database Object, 如果数据库对象改变,OData服务需要人工维护。但为了便于说明,在本文使用的例子都是直接暴露Database Object.
1 OData命名空间 (Namespace) 定义
在默认情况之下,通过OData服务生成的Schema的命名空间为项目的package的路径与xsodata文件名的拼接,例如前一篇文章的默认命名空间为weiyy.testodata.product,如图。
我们可以利用namespace关键字来修改命名空间,修改原product.xsodata,内容如下:
service namespace "test.namesp"{
"WEIYY"."PRODUCT" as "product";
}
修改之后提交并激活原来项目,
刷新原页面就可以看到修改之后的命名空间为“test.namesp”。
2 OData中的属性投影(Property Projection)
如果数据表中有多列但有时候只需要选择其中的某几列暴露出来,一方面可以做一个视图,然后暴露这个视图,另一方面可以直接使用OData中的属性投影语法,with用来选择属性,without用来排除属性。
比如对于product这个table,我们只暴露其中的id,name这两个列,修改product.osodata:
service namespace "test.namesp"{
"WEIYY"."PRODUCT" as "product" with("id","name");
}
例用without排除属性
service namespace "test.namesp"{
"WEIYY"."PRODUCT" as "product" without ("price","desc","desc_cn");
}
3 OData中的table关联与属性导航(Navigation Properties)
前面提到过,对于多表join的查询,可以通过把查询结果做成一个视图来进行暴露,笔者也是比较倾向于这种方式,但是SAP HANA 中的OData服务同时提供了另外一种查询的方式,这里也作一个说明,那就是OData中的table关联(Associations)与属性的导航。
我们新建一个assoc.xsodata文件:
service {
"WEIYY"."CATEGORY" as "CATEGORY" navigates("Product_Category" as "products");
"WEIYY"."PRODUCT" as "PRODUCT" ;
association "Product_Category" principal "CATEGORY"("id") multiplicity "1"
dependent "PRODUCT"("category_id") multiplicity "*";
}
说明:这里CATEGORY表记录PRODUCT的类别信息, association后面跟关联名称,principal一端指明关联的键,multiplicity指明关联的维度,dependent指关联的另一端。Navigates指明导航的信息。 然后提交激活并访问对应的URI,
然后我们访问CATEGORY实体,
在products这个属性中,列出了相关联的products的URL。
通过这个URL获取到category_id=1对应的product。
本篇文章只选择一部分的OData服务定义的语法介绍,有关SAP HANA OData中更多的服务定义语法请参考SAP HANA Develop Guide.
参考资料:
URI Conventions (OData Version 2.0) · OData - the Best Way to REST
[本文的测试案例所使用的SAP HANA版本为SAP HANA SPS7 Revision 70.00]