如何使用 Apache Olingo V2 实现分页?
How to implement pagination with Apache Olingo V2?
我需要使用 Apache Olingo V2 来实现 API 使用分页。这意味着我需要
为支持基本 $top 和 $skip 运算符的实体集合提供一个简单的 URL,
就像下面的例子一样:
https://services.odata.org/OData/OData.svc/Products?$top=5&$skip=3
我没有使用注释处理器扩展或 JPA 处理器扩展,所以它们是
不是实现此分页的选项。
我检查了 Olingo V2 Server documentation 但找不到实现分页的示例。
如果您不使用 Annotation Processor extension
或 JPA Processor extension
,您将使用 implemented/extended ODataSingleProcessor
。您可以从 URL from GetEntitySetUriInfo
类型参数中检索 $skip 和 $top 值,并相应地利用它来获取数据。
下面是相同的示例代码,您可能想要进行空值检查和其他敏感化。
@Override
public ODataResponse readEntitySet(GetEntitySetUriInfo uriInfo, String contentType) throws ODataException {
int skipValue = uriInfo.getSkip();
int topValue = uriInfo.getTop();
URI serviceRoot = getContext().getPathInfo().getServiceRoot();
ODataEntityProviderPropertiesBuilder propertiesBuilder = EntityProviderWriteProperties
.serviceRoot(serviceRoot);
List<Map<String, Object>> data = new ArrayList<Map<String, Object>>();
// fetch data from the datasource considering the skip and top values
// one example could be SELECT * FROM table LIMIT topValue OFFSET skipValue
// fill in the data variable
return EntityProvider.writeFeed(contentType, uriInfo.getStartEntitySet(), data, propertiesBuilder.build());
}
我需要使用 Apache Olingo V2 来实现 API 使用分页。这意味着我需要 为支持基本 $top 和 $skip 运算符的实体集合提供一个简单的 URL, 就像下面的例子一样:
https://services.odata.org/OData/OData.svc/Products?$top=5&$skip=3
我没有使用注释处理器扩展或 JPA 处理器扩展,所以它们是 不是实现此分页的选项。
我检查了 Olingo V2 Server documentation 但找不到实现分页的示例。
如果您不使用 Annotation Processor extension
或 JPA Processor extension
,您将使用 implemented/extended ODataSingleProcessor
。您可以从 URL from GetEntitySetUriInfo
类型参数中检索 $skip 和 $top 值,并相应地利用它来获取数据。
下面是相同的示例代码,您可能想要进行空值检查和其他敏感化。
@Override
public ODataResponse readEntitySet(GetEntitySetUriInfo uriInfo, String contentType) throws ODataException {
int skipValue = uriInfo.getSkip();
int topValue = uriInfo.getTop();
URI serviceRoot = getContext().getPathInfo().getServiceRoot();
ODataEntityProviderPropertiesBuilder propertiesBuilder = EntityProviderWriteProperties
.serviceRoot(serviceRoot);
List<Map<String, Object>> data = new ArrayList<Map<String, Object>>();
// fetch data from the datasource considering the skip and top values
// one example could be SELECT * FROM table LIMIT topValue OFFSET skipValue
// fill in the data variable
return EntityProvider.writeFeed(contentType, uriInfo.getStartEntitySet(), data, propertiesBuilder.build());
}