我的编程空间,编程开发者的网络收藏夹
学习永远不晚

全面解析JPA 仓库repository中的findAll()方法

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

全面解析JPA 仓库repository中的findAll()方法

解析JPA仓库repository的findAll()方法

源码

Page<T> findAll(@Nullable Specification<T> spec, Pageable pageable);

(1) Specification spec 对象

(2) Pageable pageable 对象

下面是findAll()实现类

public Page<T> findAll(@Nullable Specification<T> spec, Pageable pageable) {
		//参数spec只是一个实例,没有查询条件
		TypedQuery<T> query = getQuery(spec, pageable);
		return isUnpaged(pageable) ? new PageImpl<T>(query.getResultList())
				: readPage(query, getDomainClass(), pageable, spec);
	}

getQuery(spec,pageable)方法作用

返回一个指定操作表,指定返回项,指定排序方式,指定查询条件的query对象

1.其中getDomainClass()作用

returns the actual domain class type. 也就是数据表对应的实体类

protected TypedQuery<T> getQuery(@Nullable Specification<T> spec, Pageable pageable) {
		Sort sort = pageable.isPaged() ? pageable.getSort() : Sort.unsorted();
		return getQuery(spec, getDomainClass(), sort);
	}

2.执行getQuery方法

protected <S extends T> TypedQuery<S> getQuery(@Nullable Specification<S> spec, Class<S> domainClass, Sort sort) {
		CriteriaBuilder builder = em.getCriteriaBuilder();
		CriteriaQuery<S> query = builder.createQuery(domainClass);
		Root<S> root = applySpecificationToCriteria(spec, domainClass, query);
		query.select(root);
		if (sort.isSorted()) {
			query.orderBy(toOrders(sort, root, builder));
		}
		return applyRepositoryMethodMetadata(em.createQuery(query));
	}

其中em是EntityManager对象,用来获取CriteriaBuilder 实例(参考链接CriteriaBuilder动态构造查询)

  • CriteriaBuilder :可以用于创建CriteriaQuery、CriteriaUpdate和CriteriaDelete等
  • createQuery:hibernate的SQL操作方法,用来生成一个基于 HQL 查询字符串的 Query 对象,domainClass指的是表对应的实体类

2.1 applySpecificationToCriteria(…)方法:

将Specification中生成的Predicate应用于Criteria

private <S, U extends T> Root<U> applySpecificationToCriteria(@Nullable Specification<U> spec, Class<U> domainClass,CriteriaQuery<S> query) {
		Assert.notNull(domainClass, "Domain class must not be null!");
		Assert.notNull(query, "CriteriaQuery must not be null!");
		Root<U> root = query.from(domainClass);
		if (spec == null) {
			return root;
		}
		CriteriaBuilder builder = em.getCriteriaBuilder();
		Predicate predicate = spec.toPredicate(root, query, builder);
		if (predicate != null) {
			query.where(predicate);
		}
		return root;
	}

spec.toPredicate(…)方法,是spec实例调用Spec类中的toPredicate(),获取查询条件。

where()源码翻译:

query.where(predicate)作用,根据predicate(查询条件的集合)修改query限制查询结果(如果之前有条件限制,会自动替换),如果此次没有添加任何限制,之前的条件限制会被移除(也就是说,条件限制会覆盖),这里的where()重写了AbstractQuery接口中where(),predicate条件可以为空也可以是多个,返回结果是the modified query

2.2 回到getQuery方法中

query.select(root);
		if (sort.isSorted()) {
			query.orderBy(toOrders(sort, root, builder));
		}
  • query.select():指定要在查询结果中返回的项(覆盖,若之前有所指定,则覆盖),这里指定返回项是表对应的实体类,返回结果是the modified query
  • query.orderBy():修改排序规则,返回结果也是the modified query,这里不对 toOrders过多的即使
return applyRepositoryMethodMetadata(em.createQuery(query));
  • em.createQuery(query):创建TypedQuery 实例,用来执行executing a criteria query

执行查询语句,返回结果集(不做详细分析)

return isUnpaged(pageable) ? new PageImpl<T>(query.getResultList())
				: readPage(query, getDomainClass(), pageable, spec);
  • query.getResultList():返回查询结果(相当于hibernate中list()方法执行hql,返回结果)
  • getResultList():方法会调用doList()方法

这个方法中会生成SQL语句expandeQuery:

select generatedAlias0 from Students as generatedAlias0 where 1=1 order by generatedAlias0.studentAge desc

jpa Repository的findOne正确写法和findAll

@GetMapping("/user/{id}")
public User getUser(@PathVariable("id") Integer id) {
    User user = new User();
    user.setId(id);
    Example<User> example = Example.of(user);
    Optional<User> one = userRepository.findOne(example);
    return one.get();
}
@GetMapping("/user/all")
public List<User> getAll() {
    List<User> all = userRepository.findAll();
    System.out.println(all);
    return  all;
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

全面解析JPA 仓库repository中的findAll()方法

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

全面解析JavaScript中offsetLeft、offsetTop的用法

本文主要介绍了全面解析JavaScript中offsetLeft、offsetTop的用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-05-17

全面解析Android中对EditText输入实现监听的方法

在 Android design support 包中提供了一种在输入不合适字符时一直显示的提示方式来显示,现在已经开始在更多的应用上被使用了;这些 Android app 在显示他们的错误提示时采用的不同的方式常常让人感觉非常的不和谐。
2022-06-06

全面解析Python的While循环语句的使用方法

Python 编程中 while 语句用于循环执行程序,即在某条件下,循环执行某段程序,以处理需要重复处理的相同任务。其基本形式为:while 判断条件:执行语句……执行语句可以是单个语句或语句块。判断条件可以是任何表达式,任何非零、或非空
2022-06-04

全面解析Android应用开发中Activity类的用法

Activity类处于android.app包中,继承体系如下: 1.java.lang.Object 2.android.content.Context 3.android.app.ApplicationContext 4.android
2022-06-06

全面了解python中的类,对象,方法,属性

python中一切皆为对象,所谓对象:我自己就是一个对象,我玩的电脑就是对象,坐着的椅子就是对象,家里养的小狗也是一个对象。。。。。。 我们通过描述属性(特征)和行为来描述一个对象的。比如家里的小狗,它的颜色,大小,年龄,体重等是它的属性或
2022-06-04

如何使用Pandas处理数据中的重复值:全面解析去重方法

Pandas去重方法全面解析:轻松处理数据中的重复值,需要具体代码示例引言:在数据分析和处理过程中,常常遇到数据中包含重复值的情况。这些重复值可能会对分析结果产生误导或影响数据的准确性。因此,去重是数据处理的重要一环。Pandas作为Py
如何使用Pandas处理数据中的重复值:全面解析去重方法
2024-01-24

数据库运维的制胜法宝:全面解析备份与恢复策略

数据库备份与恢复是数据库运维的重要任务之一,也是确保数据安全和可用的关键所在。本文将全面解析数据库备份与恢复策略,为数据库运维人员提供实用的指导。
数据库运维的制胜法宝:全面解析备份与恢复策略
2024-02-10

全面理解java中的构造方法以及this关键字的用法

本篇文章主要概述了如何用构造方法初始化对象,this属性名访问成员变量方法,和this()的用法,感兴趣的小伙伴一起来学习吧
2023-03-22

jsp页面传中文到数据库乱码的解决方法

这篇文章主要介绍jsp页面传中文到数据库乱码的解决方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!在web.xml中加入拦截器SpringEncodingorg.springframew
2023-06-05

C++ 函数声明中的默认参数:全面解析其声明和用法

c++++ 中的默认参数提供对函数参数指定默认值的功能,从而增强代码可读性、简洁性和灵活性。声明默认参数:在函数声明中将参数后加上 "=" 符号,后跟默认值。用法:函数调用时,若未提供可选参数,则会使用默认值。实战案例:计算两个数之和的函数
C++ 函数声明中的默认参数:全面解析其声明和用法
2024-05-02

Win7系统中启动界面安全模式无法加载disk.sys的解决方法介绍

适用范围: Thhttp://www.cppcns.cominkPad,预装Win8,预装linux,Win7 情况描述: 预装Windows 8或者Linux系统改装Windows 7时会出现卡在正在启动javascriptWindows
2023-06-05

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录