Java Apache Olingo 是否查询数据库本身?

Does Java Apache Olingo query the database itself?

在 .NET C# 中,我们使用 Odata 对来自 SQL 数据库的数据库结果进行筛选、分页和排序。 .NET 中的 Odata 实际上会进入数据库,并查询 WHERE,ORDER By Filters 到数据库,而不是提取所有数据库结果,并在 api 内存上应用过滤。

我对 Java Apache Olingo 很好奇,在内部查询数据库或在 API 内存集上应用过滤。

资源:

https://www.odata.org/libraries/

https://www.odata.org/documentation/odata-version-2-0/uri-conventions/

编辑:正如@Olivier 提到的,我最初的回答是指 .NET 中的 OData 而不是 Olingo。

不幸的是,您可能已经发现,标准的 Olingo documentation 没有直接 回答这个特定问题,尽管它确实提到了对延迟加载的支持和流式传输行为(在应用程序级别进行过滤没有任何意义)。

但是,现在您很难找到 支持数据库级别过滤的 ORM 或 DB 适配器,因为这几乎总是比这样做更快因此在您的非平凡工作负载应用程序中。

我会尝试用更权威的来源更新这个答案。


(原答案)

this分析:

As long as your data provider supports deferred queries and you don't force evaluation by calling something like .ToList(), the query will not be evaluated until the OData filters are applied, and they'll be handled at the database level.

简而言之,如果指定了 $filter 和 $orderby,Olingo 2 JPAProcessor 将查询数据库以仅获取有限的数据。

TLDR;

这里我们需要考虑两件事。 Apache Olingo 是一个框架,它允许人们在 Java 中实现 OData 服务器和客户端,如果只是为您提供摘要 类 和您实现的接口 OdataProcessors,那么一个想要。

现在来到第二点,Olingo 项目中也提供了一个 JPA 实现,您可以找到它 here

为了回答你的问题,让我们深入研究这个项目的代码,看看它是如何实现的

我们将不得不从 JPAProcessorImpl 开始,然后跳到 process(final GetEntitySetUriInfo uriParserResultView)this is where 查询以及如何在数据库中获取数据的实际实现。

在第 150 行,实际查询已经构建,因此如果您传递 $filter(where 子句)和 $orderby,我们可以看到值实际上被传递到数据库并被烘焙查询中