通过委托增强Spring数据存储库

我最近写了几篇有关Kotlin代表团的文章。 通过这样做,我实现了一种将其应用于Spring Data存储库的有用方法。 这将使Spring Data在提供定制路线的同时继续散布一些魔力。 这篇文章中显示的代码在Kotlin中,但仍然与Java有关。

这篇文章使用R2DBC,但是内容足够通用,可以应用于任何Spring Data模块。

如果您在这些领域没有太多的背景知识,那么在Kotlin中 使用Spring Data R2DBC和类委托读取异步RDBMS访问将是有益的。

作为回顾。 Spring Data提供的魔力是什么?

Spring Data允许您编写一个仅需要定义所需查询的接口。 然后它将完成创建实现和为您注入依赖项的所有工作。 看起来像这样:

 @Repository  interface PersonRepository : R2dbcRepository<Person, Int> { @Query ( "SELECT * FROM people WHERE age > $1" ) fun findAllByAgeGreaterThan(age: Int): Flux<Person>  } 

由于正在使用Spring Data R2DBC,因此尚不完全支持完全推断的查询。 这就是为什么手动写出查询的原因。

不利的一面是它正在基于接口创建实现。 因此,如果要进行任何类型的自定义,则需要自己创建接口的实例,注入其依赖关系并实现每个查询。 例如:

 class PersonRepositoryImpl( private val entity: RelationalEntityInformation<Person, Int>, private val databaseClient: DatabaseClient, converter: R2dbcConverter, private val accessStrategy: ReactiveDataAccessStrategy  ) : SimpleR2dbcRepository<Person, Int>(entity, databaseClient, converter, accessStrategy), PersonRepository { override fun findAllByAgeGreaterThan(age: Int): Flux<Person> { val mapper: StatementMapper.TypedStatementMapper<Person> = accessStrategy.statementMapper.forType(entity.javaType) val selectSpec: StatementMapper.SelectSpec = mapper .createSelect(entity.tableName) .withProjection(accessStrategy.getAllColumns(entity.javaType)) .withCriteria(Criteria.where( "age" ).greaterThan(age)) val operation: PreparedOperation<*> = mapper.getMappedObject(selectSpec) return databaseClient.execute().sql(operation).`as`(entity.javaType).fetch().all() }  } 

是的,该查询代码可能很糟糕,我相信您可以做得更好。 你明白我的意思。

可以通过委派基于您的接口实现的Spring仓库来消除创建此类的麻烦。 然后,您可以添加所需的所有自定义。

在Kotlin中,这看起来像:

 @Repository  class DelegatingPersonRepository( private val delegate: PersonRepository) : PersonRepository by delegate { override fun <S : Person> save(objectToSave: S): Mono<S> { // override `save` implementation } // any other overrides (kotlin provides delegated implementations)  } 

在Java中,这比较麻烦,但仍然可以轻松实现:

 @Repository  public class DelegatingPersonRepository implements PersonRepository { private final PersonRepository delegate; public DelegatingPersonRepository(PersonRepository delegate) { this .delegate = delegate; } @Override public Flux<Person> findAllByAgeGreaterThan( int age) { return delegate.findAllByAgeGreaterThan(age); } @Override public <S extends Person> Mono<S> save(S entity) { // override `save` implementation } // all other implementations of `PersonRepository` functions  } 

在这两个版本中, DelegatingPersonRepository调用PersonRepository定义的findAllByAgeGreaterThan的实现。 到目前为止,还没有直接花费精力来编写查询数据库的功能。

使用DelegatingPersonRepository ,所有未覆盖的函数调用将委托给Spring创建的PersonRepository的实现。

对于像我这样的人,他真的不喜欢将SQL查询放在一起并编写所有转换代码。 通过这种方式使用委派确实可以使您充分利用Spring Data的优势,同时仍然为您提供自定义结果的空间。 您节省的代码量实际上可能不是那么大。 但是,将其组合在一起所需的工作量大大减少了。 让Spring为您完成所有繁重的工作!

翻译自: https://www.javacodegeeks.com/2019/09/augmenting-spring-data-repository-delegation.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/341196.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

git常见错误 —— broken pipe

Broken pipe git push会出现一个问题&#xff1a;就是关于文件的大小&#xff01;因为github的默认大小是100M&#xff0c;如果你的文件大于100M&#xff0c;那么你就不能成功 会出现这个&#xff1a;fatal: fatal: sha1 file <stdout> write error: Broken pipe The rem…

activemq网络桥接_ActiveMQ –经纪人网络解释–第4部分

activemq网络桥接在前面的第3部分中 &#xff0c;我们已经看到ActiveMQ如何帮助将远程使用者与本地使用者区分开来&#xff0c;这有助于确定从消息生产者到使用者的较短路径。 在第4部分中&#xff0c;我们将研究如何在远程代理上负载均衡并发使用者。 让我们考虑一些高级配置…

sublime 添加注释模块

问题背景&#xff1a; 规范的程序需要对函数进行注释&#xff0c;常用的开发工具如IDEA、VS Code都对注释模板有很好的支持。本博客介绍Sublime下支持模块注释功能的设置。 一 安装 一、安装方法 1.安装docblocker插件 mac CmdShiftP -> Install Package -> docblock…

只读副本和Spring Data第3部分:配置两个实体管理器

我们之前的设置可以正常工作。 我们现在要做的是进一步发展&#xff0c;并配置两个单独的实体管理器&#xff0c;而不会影响我们之前实现的功能。 第一步是将默认的实体管理器配置设置为主要配置。 这是第一步 package com.gkatzioura.springdatareadreplica.config; import…

Win+E快速打开我的电脑方式设置方式

W10运用快捷键WinE快速打开我的电脑设置方式

JMetro版本11.6.5和8.6.5发布

再一次问好。 设置了SDK中所有JavaFX控件的样式以及其他一些不存在的样式以及其他库中的其他样式。 后续版本将涉及调整JMetro现有样式或从第三方库的其他控件添加其他样式。 此版本就是这种情况。 这是新功能&#xff1a; 3种新的控件样式&#xff1b; 调整JMetro现有样式&a…

Chrome浏览器的便捷使用方式

截取转载于B站视频【全套教程】高效玩转Chrome浏览器&#xff0c;丰富你的上网体验_哔哩哔哩_bilibili中的脑图文件&#xff0c;便于之后的熟悉使用。 脑图链接 https://naotu.baidu.com/file/5a5332eee10dd903cc084d49189cd2behttps://naotu.baidu.com/file/5a5332eee10dd90…

Sublime查看已经安装的插件

蓝色框图内显示已经安装的插件

activemq网络桥接_ActiveMQ –经纪人网络解释–第3部分

activemq网络桥接现在&#xff0c;我们已经在本博客系列的第1部分和第2 部分中了解了ActiveMQ网络连接器的基础&#xff0c;在第3部分中&#xff0c;我们将研究ActiveMQ如何平衡连接到代理网络的使用者。 介绍 当可以无序处理队列中的消息时通常使用并发使用者&#xff0c;通常…

Word样式的导入与导出

1 样式的介绍 样式&#xff0c;也就是Word中各级标题的格式。合理的设置样式模板&#xff0c;可以帮助更方便的进行文本编辑。 2 样式的导入 具体情形为将“文档标准模板.dotm”的内容应用于“新建Microsoft Word文档”。 按照图示进行操作 【 如果应用模板为文件内的样式…

word将一个文档的样式导入到另一个文档

一、背景 在word中编辑文档时&#xff0c;经常需要定义一个样式给特定格式的文本使用&#xff0c;如标题1&#xff0c;标题2等&#xff0c;而有时需要在一个新文档A中使用一个旧文档B中定义好的样式。 二、操作步骤 1、打开旧文档B&#xff0c;选择上方标签栏的"样式&quo…

Spring Boot应用程序浪费了内存

内存是当今世界上被广泛浪费的资源之一。 由于编程效率低下&#xff0c;令人吃惊的&#xff08;有时是“令人震惊的”&#xff09;内存浪费被浪费了。 我们看到这种模式在多个企业应用程序中重复出现。 为了证明这种情况&#xff0c;我们进行了一项小型研究。 我们分析了著名的…

Win10灵活使用快速访问

I 快速访问视图 位置在winE 左侧窗口&#xff0c;点击可快速到达某个特定的文件夹。作用类似于快捷方式&#xff0c;操作简单。 II 关闭自动添加 默认是显示经常使用的文件夹。这使得窗口内文件夹较乱。 通过以下设置&#xff0c;关闭自动显示 1. 2.把框内√去掉 III 固定文…

Win10搜索文件后新窗口打开

I 问题描述 windows搜索后&#xff0c;对”文件“右击只有”打开文件位置“&#xff1b;对”文件夹“右击只有”在新窗口中打开“和”打开文件夹位置“ 1.如果点击”打开文件位置“ 或 ”打开文件夹位置“后&#xff0c;搜索的窗口页面就不见了&#xff1b;直接跳转到”那个“…

activemq网络桥接_ActiveMQ –经纪人网络解释–第2部分

activemq网络桥接在此博客中&#xff0c;我们将看到双工网络连接器如何工作。 在上一部分中&#xff0c;我们从broker-1和broker-2创建了一个网络连接器。 我们能够看到&#xff0c;当代理2上有一个使用者使用队列“ foo.bar”时&#xff0c;代理1上的队列“ foo.bar”的消息如…

Win10鼠标拖拽移动文件

拖动操作共有三种响应模式&#xff0c;分别是&#xff1a;移动、复制、创建快捷方式。 在默认情况下&#xff0c; 纯拖动操作——同盘移动&#xff0c;异盘复制拖动时按住shift键——移动拖动时按住ctrl键——复制拖动时按住alt键 或 同时按住ctrl和shift键——创建快捷方式

Apache Lucene中的并发查询执行

Apache Lucene是一个出色的并发纯Java搜索引擎&#xff0c;如果您愿意&#xff0c;它可以轻松地使服务器上的可用CPU或IO资源饱和。 “典型” Lucene应用程序的并发模型在搜索时每个查询一个线程&#xff0c;但是您知道Lucene还可以使用多个线程同时执行一个查询以大大减少最慢…

Windows设置自己的程序开机自动启动

Windows系统想要快速设置开机自动启动某个程序&#xff0c;可以使用以下方法设置&#xff1a; 1.找到启动文件夹 CtrlR 打开运行&#xff0c;输入shell:startup&#xff0c;回车,找到启动文件夹 2.拷贝需要开机启动的程序的快捷方式到此文件夹即可。 3.打开任务管理器-启动查…

Citavi中文件管理

目录 I 文献相对应的PDF文件相关操作 1 打开PDF所在位置 2 直接重命名PDF文献 注&#xff1a;设置角标方式 II 阅读文献相关的文件的添加与删除 1 添加 2 删除 III PPT CAJ文件的添加 I 文献相对应的PDF文件相关操作 PDF文件可直接拉入文献框进行导入 1 打开PDF所在位置…

coldfusion_我从ColdFusion迁移到Java开发

coldfusion尽管我在大学和研究生的整个职业生涯中都研究和尝试了不同的开发技术和工具&#xff0c;但我的全职职业生涯始于Adobe ColdFusion的开发。 从学校毕业后&#xff0c;使用技术解决现实世界中的业务问题本身就是一个挑战。 由于其相当简单的性质&#xff0c;ColdFusio…