【问题标题】:Does Java Apache Olingo query the database itself?Java Apache Olingo 是否查询数据库本身?
【发布时间】:2022-01-20 15:32:39
【问题描述】:

在 .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/

【问题讨论】:

    标签: java odata olingo


    【解决方案1】:

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

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

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

    我将尝试使用更权威的来源更新此答案。


    (原答案)

    根据this分析:

    只要您的数据提供者支持延迟查询并且您不通过调用 .ToList() 之类的方法来强制评估,那么在应用 OData 过滤器之前不会评估查询,并且它们将在数据库中处理级别。

    【讨论】:

    • 这并不能回答关于 Olingo 的问题。
    • 哎呀,你是对的,我一定是看错了。这些链接让我失望了。
    【解决方案2】:

    简短的回答,Olingo 2 JPAProcessor 将查询数据库以仅获取有限的数据,即指定了 $filter 和 $orderby。

    TLDR;

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

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

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

    我们必须从JPAProcessorImpl 开始,然后跳到process(final GetEntitySetUriInfo uriParserResultView)this is where 查询和实际如何在数据库中获取数据。

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

    【讨论】:

      猜你喜欢
      • 2016-01-19
      • 2022-01-26
      • 1970-01-01
      • 1970-01-01
      • 2010-10-09
      • 1970-01-01
      • 1970-01-01
      • 2019-07-01
      • 1970-01-01
      相关资源
      最近更新 更多