如何从ODATA结果集返回计数

时间:2014-06-06 09:43:02

标签: java sql odata teiid olingo

我试图从Olingo ODATA(版本2)结果集中获取我的记录计数,类似于下面的结果:

http://services.odata.org/OData/OData.svc/Categories/ $计数

以上网址返回3,并且有3个值'正如您所看到的,您是否删除了/$count

我正在本地主机上工作,这个网址是:

localhost/odata/livingODATA/address/

返回结果集,但localhost/odata/livingODATA/address/$count返回错误:

TEIID30088 Unrelated order by column g0.id cannot be used in a SET query, with SELECT DISTINCT, or GROUP BY

我尝试添加order by,似乎无济于事。

2 个答案:

答案 0 :(得分:1)

您的问题是从olingo发送到TEIID的非法SQL查询,这可能仍然具有逻辑意义,但会触发TEIID错误。但是,olingo在向查询添加未使用的SELECT时尝试count(*)只是ORDER BY g0.id。有关此错误的详细信息,请参阅jboss社区中的two bugs

虽然这种行为应该是Apache Olingo开发团队的一个问题,但$inlinecount=allpages uri-option至少可能是目前可能的解决方法。这会向结果对象添加odata.count属性,其中包含odata查询的总计数,忽略任何$top$skip选项。这是一个用于分页目的的功能。

Official OData v2 Example

http://services.odata.org/OData/OData.svc/Products?$inlinecount=allpages

你的URI可能是

localhost/odata/livingODATA/address?$inlinecount=allpages

或阻止服务一次性加载所有数据,您可以添加$top=0并仅加载coun t(*)

localhost/odata/livingODATA/address?$inlinecount=allpages&$top=0

我希望这有助于更进一步。

答案 1 :(得分:1)

您可以通过

覆盖内联计数的值
ODataEntityProviderPropertiesBuilder propertiesBuilder = EntityProviderWriteProperties
                            .serviceRoot(serviceRoot).inlineCountType(InlineCount.ALLPAGES).inlineCount(dataSet.getTotal());

顺便说一下,它正在使用版本2