iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >全面解析JPA 仓库repository中的findAll()方法
  • 591
分享到

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

2024-04-02 19:04:59 591人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录解析JPA仓库repository的findAll()方法源码getQuery(spec,pageable)方法作用1.其中getDomainClass()作用2.执行getQu

解析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;
}

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

--结束END--

本文标题: 全面解析JPA 仓库repository中的findAll()方法

本文链接: https://www.lsjlt.com/news/140188.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • 全面解析JPA 仓库repository中的findAll()方法
    目录解析JPA仓库repository的findAll()方法源码getQuery(spec,pageable)方法作用1.其中getDomainClass()作用2.执行getQu...
    99+
    2024-04-02
  • 继承jpa Repository 写自定义方法查询的实例分析
    这篇文章给大家介绍继承jpa Repository 写自定义方法查询的实例分析,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。继承jpa Repository写自定义方法查询今天在写jpa查询的时候,...
    99+
    2023-06-21
  • Spring Boot JPA Repository之existsBy查询方法失效的解决
    引言: Spring Boot号称微服务的利器,在结合了Spring Data与JPA之后,更是如虎添翼,开发快速的不像话,本文将讲述一个关于JPA中一个诡异问题的诊断分析过程以及修...
    99+
    2024-04-02
  • 浅析搭建github本地仓库的方法
    在如今的软件开发领域中,版本控制是必不可少的工具。GitHub作为一个非常流行的代码托管平台,为开发者提供了很多的便利,例如代码托管、团队协作、问题跟踪、CI/CD等等。在使用GitHub时,我们经常需要使用本地仓库,下面将介绍如何搭建Gi...
    99+
    2023-10-22
  • 详解SpringDataJPA中Repository的接口查询方法
    目录1.查询方法定义详解2.搜索查询策略3.查询创建4.属性表达式5.特殊参数处理6.限制查询结果7. repository方法返回Collections or Iterables8...
    99+
    2024-04-02
  • 全面解析JavaScript中offsetLeft、offsetTop的用法
    目录一、第一个小例子二、第二个小例子(给box1添加相对定位)三、第三个小例子(给box1,box2添加相对定位)四、解析五、扩展(在第三个例子中,假如我想获取到box3到浏览器窗口...
    99+
    2023-05-17
    JavaScript offsetLeft offsetTop
  • 对Jpa中Entity关系映射中mappedBy的全面理解
    目录对JpaEntity关系映射中mappedBy的理解对于mappedBy复习下举例说明Spring-jpa中mappedBy的作用使用@JoinColumn存在的问题使用mapp...
    99+
    2024-04-02
  • Python 页面解析Beautiful Soup库的使用方法
    目录1.Beautiful Soup库简介2.Beautiful Soup库方法介绍2.1 find_all()2.2 find()2.3 select()3.代码实例1....
    99+
    2024-04-02
  • Maven中央仓库发布的实现方法
    目录一、前言二、环境准备三、步骤说明1、工单创建2、gpg 环境安装3、Maven全局配置4、项目maven配置5、发布操作四、参考文档一、前言 最近自己在学习Spring boot...
    99+
    2024-04-02
  • Java线程池execute()方法源码全面解析
    先看作者给出的注释来理解线程池到底有什么作用 * Thread pools address two different problems: they usually * provid...
    99+
    2024-04-02
  • 深入浅析JPA在Spring Boot中的使用方法
    深入浅析JPA在Spring Boot中的使用方法?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。什么是JPA一说JavaWeb,很多小伙伴都知道SSH,这个H代表的就是hi...
    99+
    2023-05-31
    springboot jpa
  • python中partial库的使用方法解析
    源码解释: class partial: """New function with partial application of the given arguments ...
    99+
    2024-04-02
  • pandas库中to_datetime()方法的使用解析
    目录pandas to_datetime()的使用学习目标代码如下运行结果用pandas.to_datetime进行日期解析pandas to_datetime()的使用 学习目标 ...
    99+
    2024-04-02
  • 全面解析Go语言中的面量数据
    面量数据是 go 中表示常量的固定值。这些值类型包括布尔、字符串、整数、浮点和复数类型。创建面量数据可使用字面量,它们广泛应用于定义常量、提供默认值等场景中。通过理解面量数据,可编写更可...
    99+
    2024-04-03
    go语言 面量数据
  • Python第三方库jieba库与中文分词全面详解
    目录一、什么是jieba库二、jieba分词原理三、jieba库支持的三种分词模式1.精确模式2.全模式3.搜索引擎模式四、jieba库常用函数五、jieba实操练习一(jieba....
    99+
    2024-04-02
  • 全面解读canvas:深入了解canvas方法的全貌
    全面解读canvas:深入了解canvas方法的全貌,需要具体代码示例 引言:Canvas是HTML5新增的一个标签,可以通过JavaScript脚本绘制图形、动画和其他视觉效果。它为开发者提供了一个强大的平台,可以创建各种各样...
    99+
    2024-01-17
    深入了解 全貌
  • 全面分析Java方法的使用与递归
    目录java中方法的使用什么是方法方法的定义与使用方法如何进行调用及其方法调用过程方法的形参和实参方法重载方法签名递归java中方法的使用 什么是方法 举一个日常生活中的例子,比如我...
    99+
    2024-04-02
  • 全面解析pip换源方法:从入门到精通
    pip换源方法全面解析 pip作为Python包管理器,是Python开发中常用的工具之一。但是在使用pip时,可能会遇到安装速度缓慢或无法连接到pip官方源等问题。这时候就需要切换pip源来加速下载和安装。本文将介绍从入门到精...
    99+
    2024-01-16
    pip 解析 换源
  • PHP错误级别种类全面解析及排查方法
    标题:PHP错误级别种类全面解析及排查方法 在PHP开发过程中,我们经常会遇到各种各样的错误。了解PHP错误级别种类以及相应的排查方法是非常重要的。本文将对PHP错误级别种类进行全面解...
    99+
    2024-03-08
    错误解析 php错误级别 错误排查方法
  • IDEA中将SpringBoot项目提交到git仓库的方法步骤
    这里用一个博客项目提交到gitee作为演示: 1.通过网站右上角的「+」号,选择「新建仓库」,进入新建仓库页面 2.填写相关信息,下面的三个选项都不要勾 3.在打开的【Cre...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作