Spring Data JPA 流查询方法

spring data jpa 流查询方法

介绍

传统上,获取大量数据可能会导致内存资源紧张,因为它通常涉及将整个结果集加载到内存中。

=> 流查询方法通过提供一种使用 java 8 streams 增量处理数据的方法来提供解决方案。这可确保任何时候只有一部分数据保存在内存中,增强性能和可扩展性

在这篇博文中,我们将深入研究流查询方法在 spring data jpa 中的工作原理,探索它们的用例,并演示它们的实现。

对于本指南,我们使用:

ide:intellij idea(推荐用于 spring 应用程序)或 eclipsejava 版本:17spring data jpa 版本:2.7.x 或更高版本(与 spring boot 3.x 兼容)

    org.springframework.boot    spring-boot-starter-data-jpa

注意:有关更详细的示例,请访问我的 github 存储库

1.什么是流查询方式?

spring data jpa 中的流查询方法允许我们以 stream 的形式返回查询结果,而不是 list 或其他集合类型。这种方法有几个好处:

高效的资源管理:增量处理数据,减少内存开销。

延迟处理:按需获取和处理结果,非常适合分页或批处理等场景。

与函数式编程集成:流符合 java 的函数式编程特性,支持过滤、映射和收集等操作。

美间AI 美间AI

美间AI:让设计更简单

美间AI 261 查看详情 美间AI 2.如何使用流查询方法?

=> 假设我们正在开发一个电子商务应用程序并希望:

检索在特定日期之后下订单的所有客户。过滤总金额高于特定提供金额的订单。按过去 6 个月内的订单总价值对客户进行分组。返回数据作为客户名称及其总订单价值的摘要。

实体

客户:代表客户。

@setter@getter@entity@entity(name = "tbl_customer")public class customer {    @id    @generatedvalue(strategy = generationtype.identity)    private long id;    private string name;    private string email;    @onetomany(mappedby = "customer", cascade = cascadetype.all, fetch = fetchtype.lazy)    private list orders;}

订单:代表客户下的订单。

@setter@getter@entity(name = "tbl_order")public class order {    @id    @generatedvalue(strategy = generationtype.identity)    private long id;    private double amount;    private localdatetime orderdate;    @manytoone    @joincolumn(name = "customer_id")    private customer customer;}

存储库

customerrepository 用于选择客户及其在特定日期之后下的相关订单。我们使用 stream 而不是 list 来处理查询结果。

public interface customerrepository extends jparepository {    @query("""                select c from tbl_customer c join fetch c.orders o where o.orderdate >= :startdate            """)    @queryhints(            @queryhint(name = availablehints.hint_fetch_size, value = "25")    )    stream findcustomerwithorders(@param("startdate") localdatetime startdate);}

注意:

join fetch 确保订单被急切加载。

@queryhints 用于向 jpa(例如 hibernate)提供额外提示以优化查询执行。

=> 例如,当我的查询返回 100 条记录时:

前 25 条记录由应用程序获取并处理。处理完这些后,将获取接下来的 25 条记录,依此类推,直到处理完所有 100 条记录。此行为最大限度地减少了内存使用量,并避免一次将所有 100 条记录加载到内存中。

服务

@service@requiredargsconstructorpublic class customerorderservice {    private final customerrepository customerrepository;    @transactional(readonly = true)    public map getcustomerordersummary(localdatetime startdate, double minorderamount) {        try (stream customerstream = customerrepository.findcustomerwithorders(startdate)) {            return customerstream                    // filter customers with orders above the threshold                    .flatmap(customer -> customer.getorders().stream()                            .filter(order -> order.getamount() >= minorderamount)                            .map(order -> new abstractmap.simpleentry(customer.getname(), order.getamount())))                    // group by customer name and sum order amounts                    .collect(collectors.groupingby(                            abstractmap.simpleentry::getkey,                            collectors.summingdouble(abstractmap.simpleentry::getvalue)                    ));        }    }}

这里是处理数据的服务类,有两个参数startdate和minorderamount。正如您所看到的,我们不使用 sql 查询进行过滤,而是将所有数据作为流加载,然后通过 java 代码进行过滤和分组。

控制器

@restcontroller@requestmapping("/customers")@requiredargsconstructorpublic class customerordercontroller {    private final customerorderservice customerorderservice;    @getmapping("/orders")    public responseentity<map> getcustomerordersummary(            @requestparam @datetimeformat(iso = datetimeformat.iso.date_time) localdatetime startdate,            @requestparam double minorderamount    ) {        map ordersummary = customerorderservice.getcustomerordersummary(startdate, minorderamount);        return responseentity.ok(ordersummary);    }}

测试

=> 要创建测试数据,您可以在我的源代码中执行以下脚本或自己添加。

src/main/resources/dummy-data.sql

请求:

开始日期: 2024-05-01t00:00:00最小订单金额:100

curl --location 'http://localhost:8090/customers/orders?startdate=2024-05-01t00%3a00%3a00&minorderamount=100'

回应:

返回总金额等于或大于 minorderamount 的所有客户。

{  "Jane Roe": 500.0,  "John Doe": 150.0,  "Bob Brown": 350.0,  "Alice Smith": 520.0}

3. 流与列表

=> 您可以使用 intellij profiler 监控内存使用情况和执行时间。有关如何添加和测试大数据集的更多详细信息,您可以在我的 github 存储库中找到

小数据集:(10 个客户,100 个订单)

流:执行时间(~5ms),内存使用(低)列表:执行时间(~4ms),内存使用(低)

大型数据集(10.000 个客户,100.000 个订单)

流:执行时间(~202ms),内存使用(中等)列表:执行时间(~176ms),内存使用(高)

性能指标

metric stream list

initial fetch time slightly slower (due to lazy loading) faster (all at once) memory consumption low (incremental processing) high (entire dataset in memory) memory consumption low (incremental processing) high (entire dataset in memory) processing overhead efficient for large datasets may cause memory issues for large datasets batch fetching supported (with fetch size) not applicable error recovery graceful with early termination limited, as data is preloaded 总结

spring data jpa 流查询方法提供了一种优雅的方式来高效处理大型数据集,同时利用 java streams 的强大功能。通过增量处理数据,它们减少了内存消耗并与现代函数式编程范例无缝集成。

您对流查询方法有何看法?在下面的评论中分享您的经验和用例!

下一篇文章见。快乐编码!

以上就是Spring Data JPA 流查询方法的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/881912.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月28日 10:22:46
下一篇 2025年11月28日 10:23:08

相关推荐

  • SPK币未来如何?Spark Protocol(SPK)价格预测2025-2030

    目录 Spark项目概览Spark项目背景Spark项目类别1. 稳定币收益优化2. DeFi自动化基础设施3. 跨链流动性路由4. 代币经济驱动的AMM参与Spark市场分析SPK币价格分析当前指标SPK币价格预测(2025-2030)理由:总结 spark protocol (spk)正在崭露头…

    2025年12月8日 好文分享
    000
  • 比特币缩放摊牌:闪电网络,sztorc和付款的未来

    闪电网络是“巨大失败”吗?paul sztorc和alex gladstein对比特币扩展方案展开激烈争论。加入讨论! 比特币扩展对决:闪电网络、Sztorc与支付的未来 比特币扩展之争愈演愈烈!闪电网络是否兑现了它的承诺,还是如Paul Sztorc所言,是一个“巨大的失败”?本文深入探讨这场争议…

    2025年12月8日
    000
  • Aptos(APT)加密反弹:这是现在购买的最高加密货币吗?

    aptos(apt)展现出增长潜力的韧性。深入解析其技术实力、市场地位,以及在复杂信号中是否值得入手。 Aptos(APT)加密反弹:当前是否是买入的最佳时机? 在加密市场面临多空交织的背景下,Aptos(APT)正显现出复苏迹象。经历一波上涨后,APT交易价约为4.096美元,它能否守住阵地,并跻…

    2025年12月8日
    000
  • 错过了BNB? Ruvi AI的预售带有AI奖金可能是您的第二次机会

    ruvi ai(ruvi)正在提供一次诱人的预售机会,并附带潜在的ai奖金,吸引了那些未能参与binance coin(bnb)早期阶段投资者的关注。这是否是下一个重大机遇?让我们一探究竟。 错过BNB?Ruvi AI的预售和AI奖励或许是你的新机会 Binance Coin(BNB)曾带来惊人的回…

    2025年12月8日
    000
  • Ruvi AI:真的准备好Eclipse Tron和其他加密巨头吗?

    ruvi ai将区块链与人工智能结合,据预测可带来103倍的投资回报率。但这样一个新兴项目,真的能撼动tron这样的老牌巨头吗? 加密圈的朋友们注意了!尽管Tron一直在区块链领域占据一席之地,但一个新势力正悄然崛起——Ruvi AI。它带着惊人的承诺和前沿技术强势登场,是否会动摇Tron的地位?我…

    2025年12月8日
    000
  • WIF价格检查:每周需求,反弹或崩溃?

    dogwifhat(wif)价格走势扑朔迷离!我们深入分析了wif当前的价格动向、关键需求区域以及可能的反弹或下跌趋势。 加密圈的朋友们,是时候聊聊Wif了。这枚基于索拉纳链的模因币Dogwifhat(WIF)近期波动剧烈,大家都在关心:接下来它会走向何方?我们一起来看看WIF价格走势、周线级别的买…

    2025年12月8日
    000
  • Ondo Price:它可以收回$ 1并达到3美元吗?预测潜水

    ondo价格承受下行压力,但积极信号逐渐显现。它能否重返1美元并飙升至3美元?本文基于最新市场动态探讨了ondo的未来潜力。 近期,RWA代币Ondo经历了剧烈波动,但是否已为强势反弹做好准备?我们将深入分析技术图表,并探讨分析师对于Ondo重回1美元甚至冲击更高目标的看法。 Ondo价格:迈向1美…

    2025年12月8日
    000
  • Neo Pepe硬币:模因令牌接管加密货币预售

    neo pepe coin($neop)正在成为一种独特的模因币,凭借其结构化的预售机制、强大的治理模式以及以社区为中心的理念迅速崭露头角。 在不断变化的加密货币市场中,一个全新的模因币正掀起热潮:Neo Pepe Coin($neop)。当Pepe币面临下行压力时,Neo Pepe以其创新策略和坚…

    2025年12月8日
    000
  • Magacoin Finance:2025年投资者的宠儿?

    magacoin finance在2025年以其预售吸引了大量投资者的目光。这款结合模因元素与创新功能的代币,是否真的具备引爆市场的潜力? Magacoin Finance:2025年加密投资新焦点? 在快速演变的加密货币领域中,Magacoin Finance自2025年起便凭借其预售活动引起了广…

    2025年12月8日
    000
  • Cathie Wood,Ark Invest和Circle Shares:在Stablecoin Wave上狂野的旅程

    cathie wood的ark invest在其持有的circle(crcl)股份上进行了调整,这一举动正值稳定币市场乐观情绪高涨之际,受到监管进展与市场热情的双重推动。 Cathie Wood、Ark Invest与Circle Shares:在稳定币浪潮中的激荡旅程 ARK Invest在Cir…

    2025年12月8日
    000
  • Neo Pepe Presale:下一个大模因硬币?

    潜入neo pepe预售热潮!这是下一个pepe还是shib?揭示投资者为何纷纷加入neo pepe浪潮。 Neo Pepe预售:下一个热门模因币? 青蛙币正在崛起,Neo Pepe引发热议!随着预售阶段的火热进行,Neo Pepe是否有望成为下一个现象级模因币?我们一起来看看是什么让这款以青蛙为主…

    2025年12月8日
    000
  • Cardano,Polkadot和未固定的ROI:解码最新的加密策略

    探索cardano与polkadot的比特币布局,以及unstaked所带来的高回报潜力,为精明的加密投资者提供新视角。 Cardano、Polkadot与Unstaked正在加密领域掀起波澜。让我们深入剖析它们的战略及其潜在投资回报。 Cardano的比特币部署:推动DeFi发展? Cardano…

    2025年12月8日
    000
  • Ruvi AI:区块链技术遇到了现实世界实用程序 – 下一件大事?

    ruvi ai能否引领下一轮牛市?探索其区块链与人工智能的融合如何对接实际应用,从而确立其顶级加密竞争者的地位。 加密世界不断创新,而Ruvi AI正站在风口浪尖。通过将区块链技术与现实应用场景结合,它不仅仅是一个普通的代币,更可能成为颠覆行业的关键角色。 Ruvi AI:连接区块链与AI,创造真实…

    2025年12月8日
    000
  • 云挖掘,比特币和XRP:2025透视图

    通过flare的firelight等创新平台探索2025年云挖矿、比特币角色演变以及xrp在去中心化金融中的整合。 云挖矿、比特币与XRP:2025展望 进入2025年,加密货币领域仍在快速演进。我们来看看当前围绕云挖矿的最新进展、比特币持续发展的定位,以及XRP在DeFi(去中心化金融)方面的突破…

    2025年12月8日
    000
  • Binance,创始人和ATH:浏览加密货币景观

    cz谈市场调整与ath前景,结合ruvi ai等bnb潜在竞争者的崛起,勾勒出加密市场的复杂格局。 Binance、创始人与ATH:穿越加密世界的视角 加密货币领域从不缺乏动态变化。从市场回调到新型实用代币的涌现,这一行业持续演变。我们来探讨一下Binance的最新动向、创始人的观点,以及对下一个历…

    2025年12月8日
    000
  • Ruvi AI vs. Solana:2025年的投资回报

    ruvi ai:以ai与区块链的融合掀起热潮,挑战solana霸主地位,或带来高达13,200%的roi。它会是加密投资的新未来吗? 在持续演化的加密领域中,投资者始终在寻找下一个风口。尽管Solana凭借其高效的区块链技术广受欢迎,但Ruvi AI(简称Ruvi)正以AI与区块链结合的独特模式崭露…

    2025年12月8日
    000
  • 矿工发货狂热:块状铅牵引,而乔格倾角和vechain氛围

    blockdag的矿工运输即将启动,与dogecoin的价格挣扎和vechain的生态扩展形成鲜明对比。blockdag会成为下一个大事件吗? 加密世界从不停歇,精彩剧情也从未中断。眼下,所有人关注的焦点都集中在矿工交付进展上,而Dogecoin正面临市场压力,同时Vechain则悄然推动其技术升级…

    2025年12月8日
    000
  • 策略,比特币,BTC购买:公司如何堆入比特币

    诸如战略、metaplanet 和 cardone capital 之类的公司正越来越多地将比特币视为核心国库资产,而不仅仅是投机工具。这一趋势背后的原因是什么?又将如何影响比特币的未来? 公司如何大举买入比特币:最新动态 比特币世界正在掀起一股热潮!越来越多的公司将比特币(BTC)纳入其核心资产配…

    2025年12月8日
    000
  • BNB价格:2025年预测和关键水平要观看

    bnb是否呈现牛市格局?查看价格预测、主要支撑/阻力位及影响bnb未来走势的因素 BNB价格:2025年展望与关键点位分析 BNB最近频频登上新闻头条。随着价格波动加剧,分析师们的预测也出现分歧,让我们一起来梳理BNB当前的走势,并探讨2025年的可能趋势。 当前BNB价格与近期动态 目前BNB价格…

    2025年12月8日
    000
  • Hive Digital的多伦多AI数据中心:主权强国

    hive digital在多伦多插上旗帜,将其数据中心升级为ai计算的核心力量。这一大胆举措对加拿大在人工智能领域的雄心意味着什么? 嘿,注意啦!Hive Digital在多伦多设立的新AI数据中心正引发广泛关注。这不仅仅是一次普通的扩张;而是一场抢占加拿大AI高地的战略布局。我们来一探究竟。 多伦…

    2025年12月8日
    000

发表回复

登录后才能评论
关注微信