Spring Data 2021.1 (Q)升级说明

Spring Data 2021.1 (Q) Release Notes

Spring Data Commons—2.6版本

1、域模型现jMolecules增加了@Identity注解

2、QuerydslPredicateExecutor、QueryByExampleExecutor 及其响应式变体为 Spring Data 提供了强大的查询构建能力。它们允许你以更灵活和动态的方式定义查询,支持流式处理结果,并提供了与多种存储模块和响应式编程框架的集成。通过使用这些接口和特性,你可以构建出更高效、更易于维护的查询逻辑。

(1)QueryDslPredicateExecutor是Spring Data JPA提供的一个接口,用于在查询中使用动态条件。它允许开发人员根据不同的查询条件动态构建查询语句,而无需手动编写SQL语

       // 1. 添加依赖// pom.xml<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>com.querydsl</groupId><artifactId>querydsl-jpa</artifactId></dependency>// 2. 创建实体类@Entity@Table(name = "users")@QueryEntitypublic class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String username;private String email;// other fields, getters, and setters}// 3. 创建查询接口public interface UserRepository extends JpaRepository<User, Long>, QueryDslPredicateExecutor<User> {}// 4. 使用动态条件查询@Servicepublic class UserService {@Autowiredprivate UserRepository userRepository;public List<User> searchUsers(String username, String email) {QUser qUser = QUser.user;BooleanExpression predicate = qUser.username.eq(username).and(qUser.email.eq(email));return (List<User>) userRepository.findAll(predicate);}}

(2)QueryByExampleExecutor是一种查询技术,允许动态创建查询,并且不需要编写包含字段名称的查询

	public interface QueryByExampleExecutor<T> {// 根据实例查找一个对象<S extends T> Optional<S> findOne(Example<S> var1);// 根据实例查找一批对象<S extends T> Iterable<S> findAll(Example<S> var1);// 根据实例查找一批对象,且排序<S extends T> Iterable<S> findAll(Example<S> var1, Sort var2);// 根据实例查找一批对象,且排序和分页<S extends T> Page<S> findAll(Example<S> var1, Pageable var2);// 根据实例查找,返回符合条件的对象个数<S extends T> long count(Example<S> var1);// 根据实例查找,返回符合条件的对象<S extends T> boolean exists(Example<S> var1);}
@Test
public void testQBE() {SystemUser systemUser = new SystemUser();systemUser.setUname("li");ExampleMatcher matcher = ExampleMatcher.matching().withMatcher("uname", ExampleMatcher.GenericPropertyMatchers.startsWith());Example<SystemUser> example = Example.of(systemUser, matcher);List<SystemUser> systemUserList = this.userRepository.findAll(example);System.out.println(systemUserList);
}

3、Spring Data JPA提供了@DomainEvents注解,用于在deleteInBatch 和 deleteAllInBatch发布事件。

4、Spring Data引入Uni和Multi类型作为存储库查询方法的返回类型,支持响应式编程模型,特别是在处理大量数据或需要非阻塞操作的情况下。Uni代表一个可能发出单个项的响应式序列,而Multi代表一个可能发出零个或多个项的响应式序列。不是所有的数据库和存储系统都支持响应式编程模型。因此,在选择使用响应式存储库时,你需要确保你的目标存储系统支持响应式操作。

5、Spring Data 3.0不再支持RxJava 2。RxJava 2在2021年2月28日就结束了,我们建议使用RxJava 3。(RxJava是一个Java VM实现的响应式扩展(Reactive Extensions)库)

Spring Data JPA - 2.6

1、JpaRepositoryFactory.getRepositoryFragments(RepositoryMetadata, EntityManager, EntityPathResolver, CrudMethodMetadata)允许自定义片段,提供更多的上下文信息,而不需要对字段进行反射访问。

Spring Data MongoDB - 3.3

1、当使用@DocumentReference注解时,Spring Data MongoDB会自动处理引用的解析。在存储时,它通常会将引用的实体ID值存储为对另一个文档的引用。在检索时,它会使用这个ID值去查找并加载相应的实体。使用@DocumentReference注解时,需要考虑到性能问题。如果频繁地进行跨文档查询或加载操作,可能会对性能产生一定的影响。因此,在设计数据模型时,需要权衡好灵活性和性能之间的关系

class Account {@Id String id;
}class Person {@Id String id;@DocumentReference List<Account> accounts;
}

2、添加对创建时间序列集合的支持

MongoDB 5.0引入了时间序列集合,springDateMongoDB支持创建时间序列集合。

@TimeSeries(collection = "weather", timeField = "timestamp")
public class Measurement {String id;Instant timestamp;// ...
}

3、支持通配符索引(在MongoDB中,通配符索引(Wildcard Index)允许你使用通配符来索引文档中的任意字段,例:db.yourCollectionName.createIndex({“$**”: 1})
)

@Document
@WildcardIndexed
public class Product {// …
}
Document
@WildcardIndexed(wildcardProjection = "{ 'userMetadata.age' : 0 }")
public class User {private @Id String id;private UserMetadata userMetadata;
}
@Document
public class User {private @Id String id;@WildcardIndexedprivate UserMetadata userMetadata;
}

4、写入时包含/排除 null 属性

从实体写入 Document 时,跳过值为 null 的属性。 @Field(write=…) 可以用来控制是否跳过(默认)此类属性,或者是否强制将 null 属性写入 Document

5、加密属性的模式派生

可以使用@Encrypted对字段进行加密

@Document
@Encrypted(keyId = "xKVup8B1Q+CkHaVRx+qa+g==", algorithm = "AEAD_AES_256_CBC_HMAC_SHA_512-Random") 
static class Patient {@Id String id;String name;@Encrypted String bloodType;@Encrypted(algorithm = "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic") Integer ssn;
}

Spring Data Couchbase - 4.3

1、优化IN查询绑定标记计算

当结合使用IN关系和绑定标记进行查询时,每一个IN列表中的元素都会生成一个独立的绑定标记。这意味着,如果IN列表很长,查询准备阶段会创建大量的绑定标记,这不仅增加了内存使用量,而且可能导致性能下降,特别是在缓存准备好的语句时。

这一版本对此进行了优化。现在,当使用IN关系和绑定标记时,Spring Data Couchbase会使用单个参数绑定标记来代替多个绑定标记。这意味着,不论IN列表中有多少个元素,都只会创建一个绑定标记。这样做的好处是显著减少了内存使用,并提高了查询准备的效率。

Spring Data Redis - 2.6

1、从这个版本开始,您可以使用Redis 6.2命令,例如 LMOVE / BLMOVE , ZMSCORE , ZRANDMEMBER , HRANDFIELD ,以及更多。有关引入的命令的完整列表,请参阅2.6.0-M1发行说明。

2、RedisURI-based configuration of LettuceConnectionFactory
可以使用 RedisURI 来简化 Lettuce 连接工厂的配置。RedisURI 类提供了一种方便的方式来表示 Redis 服务器的 URI,并包含所有必要的连接参数,如主机名、端口、密码等

import io.lettuce.core.RedisURI;  
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;  
import org.springframework.data.redis.core.RedisTemplate;  
import org.springframework.context.annotation.Bean;  
import org.springframework.context.annotation.Configuration;  @Configuration  
public class RedisConfig {  @Bean  public LettuceConnectionFactory redisConnectionFactory() {  RedisURI redisUri = RedisURI.create("redis://user:password@localhost:6379/0");  return new LettuceConnectionFactory(redisUri);  }  @Bean  public RedisTemplate<Object, Object> redisTemplate(LettuceConnectionFactory redisConnectionFactory) {  RedisTemplate<Object, Object> template = new RedisTemplate<>();  template.setConnectionFactory(redisConnectionFactory);  return template;  }  
}

3、为 RedisCache 配置批处理策略

RedisCacheManagerBuilder.fromCacheWriter(RedisCacheWriter.nonLockingRedisCacheWriter(connectionFactory, BatchStrategies.scan(42)));

4、MessageListener 可以监听已订阅或未订阅的事件

当使用 MessageListener 进行订阅确认回调时,此版本包括对 SubscriptionListener 的支持,当订阅成功或失败时,它可以提供回调方法,以便开发者能够执行相应的操作

ReactiveRedisMessageListenerContainer和ReactiveRedisOperations提供的receiveLater(…)和listenToLater(…)方法则是用于异步处理Redis订阅的。这些方法允许你将接收到的消息或订阅事件延迟处理,以便在稍后的时间点或不同的线程中处理它们。这对于需要高并发或低延迟的应用程序来说是非常有用的,因为它可以帮助避免阻塞主线程并提高系统的响应性。

使用receiveLater(…)和listenToLater(…)方法时,你可以将它们与Spring的反应式编程模型(如Flux和Mono)结合使用,以实现更复杂的异步处理逻辑。例如,你可以将接收到的消息发布到一个反应式流中,并在流的下游进行进一步的处理、转换或聚合。

Spring Data JDBC - 2.3

1、对大型结果集进行流式处理

JDBC存储库查询方法现在可以直接从 ResultSet 返回 Stream ,而不是将结果收集到一个List 中。这种改变减少了内存压力和延迟,直到第一个结果出现。

interface PersonRepository extends CrudRepository<Person, Long> {@Query("SELECT * FROM person WHERE name  < :upper and name > :lower")Stream<Person> findAsStream(String lower, String upper);
}

2、现在可以通过使用接口或DTO投影(包括动态投影)来返回投影。注意,当指定自定义 RowMapper 时,不能使用投影。

(1)接口投影

interface NamesOnly {String getFirstname();String getLastname();
}interface PersonRepository extends Repository<Person, UUID> {Collection<NamesOnly> findByLastname(String lastname);
}

(2)DTO投影

import lombok.Value;
/***使用DTO的方式返回用户名,需要构造函数,我们使用lombok的@Value方法来简化代码*/
@Value
public class UsernameDTO{private String userName;
}

(3)动态投影

interface PersonRepository extends Repository<Person, UUID> {<T> Collection<T> findByLastname(String lastname, Class<T> type);
}void someMethod(PersonRepository people) {Collection<Person> aggregates =people.findByLastname("Matthews", Person.class);Collection<NamesOnly> aggregates =people.findByLastname("Matthews", NamesOnly.class);
}

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

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

相关文章

python维护代理ip的实现

前言&#xff1a; Python代理IP爬虫是一种可以让爬虫拥有更多网络访问权限的技术。 代理IP的作用是可以为爬虫提供多个IP地址&#xff0c;从而加快其爬取数据的速度&#xff0c;同时也可以避免因为访问频率过高而被网站封禁的问题。本文将介绍如何使用Python实现代理IP的爬取和…

突破界限 千视将在 NAB 2024 展会上展示领先的 AV over IP 技术

突破界限&#xff01;千视将在 NAB 2024 展会上展示领先的 AV over IP技术 作为AV over IP领域的先驱者&#xff0c;Kiloview将于2024年4月14日至17日在NAB展会&#xff08;展台号&#xff1a;SU6029&#xff09;隆重登场&#xff0c;展示我们领先业界的AV over IP产品、解决方…

【问题】解决1130-Host‘ ‘is not allowed to connect to this MySQL 本地无法连接服务器的数据库

【问题】解决1130-Host‘ ‘is not allowed to connect to this MySQL 本地无法连接服务器的数据库 原因: 默认mysql只允许 localhost 本地访问数据库, 解决方法 将 localhost 改为 % 所有 第一步 回车 输入密码 mysql -u root -p 第二步 切换数据库 use mysql 第三步 更新所…

Day96:云上攻防-云原生篇Docker安全系统内核版本漏洞CDK自动利用容器逃逸

目录 云原生-Docker安全-容器逃逸&系统内核漏洞 云原生-Docker安全-容器逃逸&docker版本漏洞 CVE-2019-5736 runC容器逃逸(需要管理员配合触发) CVE-2020-15257 containerd逃逸(启动容器时有前提参数) 云原生-Docker安全-容器逃逸&CDK自动化 知识点&#xff1…

Ubuntu下配置Android NDK环境

Android-NDK的下载 下载Android-NDK wget -c http://dl.google.com/android/ndk/android-ndk-r10e-linux-x86_64.bin 执行bin文件&#xff08;即解压&#xff09; ./android-ndk-r10c-linux-x86_64.bin Android-NDK的配置 要想使用Android-NDK&#xff0c;还需要进行环境变量…

GitHub repository - Code - Issues - Pull Requests - Wiki

GitHub repository - Code - Issues - Pull Requests - Wiki 1. Code2. Issues3. Pull Requests4. WikiReferences 1. Code 显示该仓库中的文件列表。仓库名下方是该仓库的简单说明和 URL. 2. Issues 用于 BUG 报告、功能添加、方向性讨论等&#xff0c;将这些以 Issue 形式进…

less+rem适配+媒体查询布局(主流)

rem适配布局 一.rem基础二.媒体查询1.概念2.语法&#xff08;1&#xff09;.mediatype查询类型&#xff08;2&#xff09;.关键字&#xff08;3&#xff09;.媒体特性&#xff08;4&#xff09;.应用 3.媒体查询rem实现元素动态大小变化4.引入资源&#xff08;针对不同媒体查询…

C语言如何初始化指针?

一、问题 如何初始化指针&#xff1f;只有初始化的指针才可以使⽤&#xff0c;这个与普通变量没有区别。 二、解答 定义指针变量之后&#xff0c;必须为其赋具体的值&#xff0c;⽽且指针变量的赋值只能赋予地址&#xff0c;绝对不可以是其他数据&#xff0c;并且要注意数据类…

JSONP是跨域资源共享的古老技术吗

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

JSON(JavaScript Object Notation)

目录 是什么 为什么会设计json 数据结构 数据类型 字符串&#xff08;String&#xff09; 数字&#xff08;Number&#xff09; 对象&#xff08;Object&#xff09; 数组&#xff08;Array&#xff09; 布尔值&#xff08;Boolean&#xff09; null 基本结构 对象…

前端和后端解决跨域问题的方法

目前很多java web开发都是采用前后端分离框架进行开发&#xff0c;相比于单体项目容易产生跨域问题。 一、跨域问题CORS 1.什么是跨域问题&#xff1f; 后端接收到请求并返回结果了&#xff0c;浏览器把这个响应拦截了。 2.跨域问题是怎么产生的&#xff1f; 浏览器基于同源…

spring boot 集成rocketMq + 基本使用

1. RocketMq基本概念 1. NameServer 每个NameServer结点之间是相互独立&#xff0c;彼此没有任何信息交互 启动NameServer。NameServer启动后监听端口&#xff0c;等待Broker、Producer、Consumer连接&#xff0c; 相当于一个路由控制中心。主要是用来保存topic路由信息&#…

C语言的顺序表详解

一.顺序表概念和结构 1.顺序表的概念 顺序表是一种线性表的存储结构&#xff0c;它通过一段连续的存储空间来存储表中的元素&#xff0c;元素之间的顺序由它们在存储空间中的物理位置决定。顺序表可以使用数组来实现&#xff0c;也称为数组顺序表。 2.顺序表的结构 顺序表的…

ETL中如何运用好MQ消息集成

一、ETL的主要作用 ETL&#xff08;Extract, Transform, Load&#xff09;是数据仓库中的关键环节&#xff0c;其主要作用是将数据从源系统中抽取出来&#xff0c;经过转换和清洗后加载到数据仓库中。具体而言&#xff1a; Extract&#xff08;抽取&#xff09;&#xff1a;从…

Ubuntu 安装Java、Git、maven、Jenkins等持续集成环境

Ubuntu 持续集成 安装OpenJdk 查看所有可安装的 JDK 版本 apt list OpenJDK\*使用 apt 安装 JDK&#xff08;以 11为例&#xff09;,最好是用11&#xff0c;java8对应的jenkins会有兼容问题。 sudo apt install openjdk-11-jdk openjdk-11-jre安装成功后&#xff0c;可以使用以…

机器学习_XGBoost模型_用C++推理示例Demo

1. 需求 将 python 训练好的 xgboost 模型, 使用C 进行加载并进行推理(预测) 2. 代码实现 #include <iostream> #include <fstream> #include <sstream> #include <vector> #include <string> #include <xgboost/c_api.h>const char *m…

WS2812B彩灯

目录 1、介绍 2、参数 3、引脚功能 4、应用电路 5、Code 1、介绍 WS2812是一种智能控制LED灯源&#xff0c;集成了控制电路和RGB芯片在一个5050封装组件中。它的主要特点和技术规格如下&#xff1a; 集成设计&#xff1a;WS2812将控制电路和RGB芯片集成在同一个封装中&…

软考高级架构师:数据库模式概念和例题

一、AI 讲解 数据库模式分为三个层次&#xff1a;外模式、概念模式和内模式。这三个层次分别对应不同的抽象级别&#xff0c;帮助数据库管理员和用户以不同的视角理解数据库结构。 外模式&#xff08;用户级&#xff09;&#xff1a;是数据库用户的视图。每个用户可以通过外模…

HarmonyOS NEXT应用开发—在Native侧实现进度通知功能

介绍 本示例通过模拟下载场景介绍如何将Native的进度信息实时同步到ArkTS侧。 效果图预览 使用说明 点击“Start Download“按钮后&#xff0c;Native侧启动子线程模拟下载任务Native侧启动子线程模拟下载&#xff0c;并通过Arkts的回调函数将进度信息实时传递到Arkts侧 实…

下采样-高斯金字塔

高斯金字塔是一种图像金字塔的构建方法&#xff0c;用于实现图像的下采样。它通过对原始图像进行重复的高斯滤波和下采样操作&#xff0c;以获得不同分辨率的图像。下面通过图文并茂的方式详细描述高斯金字塔的构建过程。 1. 原始图像 2. 应用高斯滤波&#xff1a;首先&#…