(1)Root<T> root

代表了可以查询和操作的实体对象的根,如果将实体对象比喻成表名,那 root 里面就是这张表里面的字段,这不过是 JPQL 的实体字段而已。通过里面的 Path<Y> get(String attributeName),来获得我们想操作的字段。

(2)CriteriaQuery<?> query

代表一个 specific 的顶层查询对象,它包含着查询的各个部分,比如 select 、from、where、group by、order by 等。CriteriaQuery 对象只对实体类型或嵌入式类型的 Criteria 查询起作用,简单理解,它提供了查询 ROOT 的方法。常用的方法有:

CriteriaQuery<T> where(Predicate... restrictions);
CriteriaQuery<T> select(Selection<? extends T> selection);
CriteriaQuery<T> having(Predicate... restrictions);

(3)CriteriaBuilder cb

用来构建 CritiaQuery 的构建器对象,其实就相当于条件或者是条件组合,并以 Predicate 的形式返回。下面是构建简单的 Predicate 示例:

Predicate p1=cb.like(root.get(“name”).as(String.class), “%”+uqm.getName()+“%”);
Predicate p2=cb.equal(root.get("uuid").as(Integer.class), uqm.getUuid());
Predicate p3=cb.gt(root.get("age").as(Integer.class), uqm.getAge());

构建组合的 Predicate 示例:

Predicate p = cb.and(p3,cb.or(p1,p2));

(4)实际经验

到此我们发现其实 JpaSpecificationExecutor 帮我提供了一个高级的入口和结构,通过这个入口,可以使用底层 JPA 的 Criteria 所有方法,其实就可以满足了所有业务场景。但在实际工作中,需要注意的是,如果一旦我们写的实现逻辑太复杂,第二个人看不懂时,那一定是有问题的,我要寻找更简单的、更易懂的、更优雅的方式。比如:

  • 分页和排序我们就没有比较自己再去实现一遍逻辑,直接用其开放的 Pageable 和 Sort 即可。
  • 当我们过多的使用 group 或者 having、sum、count 等内置的 SQL 函数的时候,我们想想就是通过 Specification 实现了逻辑,这种效率真的高吗?是不是数据在其他算好更好?
  • 当我们过多的操作 left join 和 inner Join 的链表查询的时候,我们想想,是不是通过数据库的视图(view)更优雅一点?

Spring Data JPA 从入门到精通~Criteria概念的简单介绍相关推荐

  1. Spring Data JPA 从入门到精通~@Version处理乐观锁的问题

    @Version 处理乐观锁的问题 @Version 乐观锁介绍 我们在研究 Auditing 的时候,发现了一个有趣的注解 @Version,源码如下: package org.springfram ...

  2. Spring Data JPA 从入门到精通~实际工作的应用场景

    在实际工作中,有哪些场景会用到自定义 Repository 呢,这里列出几种实际在工作中的应用案例. 1. 逻辑删除场景 可以用到上面说的两种实现方式,如果有框架级别的全局自定义 Respositor ...

  3. Spring Data JPA 从入门到精通~EntityManager介绍

    EntityManager 介绍 我们前面已经无数次提到了,JPA 的默认 Repository 的实现类是 SimpleJpaRepository,而里面的具体实现就是调用的 EntityManag ...

  4. Spring Data JPA 从入门到精通~JpaSpecificationExecutor示例

    新建两个实体 @Entity(name = "UserInfoEntity") @Table(name = "user_info", schema = &quo ...

  5. Spring Data JPA 从入门到精通~JpaSpecificationExecutor的使用方法

    JpaSpecificationExecutor 源码和 API 我们也可以通过 idea 工具详细看其用法和实现类,JpaSpecificationExecutor 是 Repository 要继承 ...

  6. Spring Data JPA 从入门到精通~QueryByExampleExecutor的使用

    QueryByExampleExecutor 的使用 按示例查询(QBE)是一种用户友好的查询技术,具有简单的接口,它允许动态查询创建,并且不需要编写包含字段名称的查询.从 UML 图中,可以看出继承 ...

  7. spring data jpa从入门到精通_Spring Data JPA的简单入门

    前言 spring data JPA是spring团队打造的sping生态全家桶的一部分,本身内核使用的是hibernate核心源码,用来作为了解java持久层框架基本构成的样本是再好不过的选择.最近 ...

  8. Spring Data JPA 从入门到精通~Naming命名策略详解及其实践

    Naming 命名策略详解及其实践 用 JPA 离不开 @Entity 实体,我都知道实体里面有字段映射,而字段映射的方法有两种: 显式命名:在映射配置时,设置的数据库表名.列名等,就是进行显式命名, ...

  9. Spring Data JPA 从入门到精通~默认数据源的讲解

    默认数据源 spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://1 ...

最新文章

  1. SSHFD:IBM提出的单阶段人体跌倒检测网络
  2. ftp 425 问题
  3. optparse模块
  4. MVC4实现批量更新数据
  5. 【Linux抓包工具之tcpdump】
  6. Java中的==和equals区别
  7. 配置maven环境变量cmd控制台提示:mvn不是内部或外部命令,也不是可运行的程序或批处理文件...
  8. python中split函数_python strip()函数和Split函数的用法总结
  9. 制作纯净版WinPE2.0
  10. 悉尼科技大学量子计算_世界排名前12位的量子计算研究型大学
  11. ajax带token获得返回数据,jquery带token访问接口ajax
  12. wav转mp3 c语言源码,C/C++知识点之mp3格式转wav格式 附完整C++算法实现代码
  13. 庞贝古城千年废墟复活:VR模型与眼动追踪复现被火山灰掩埋的建筑
  14. Xunity.autotranslator机翻unity引擎的游戏
  15. GPU 选择 深度学习 图像识别
  16. php画梯形,利用css来画出各种样式不同的梯形,html中梯形外框怎么做
  17. 自动化控制行业常见面试问题分析
  18. 【面试】蜻蜓FM2020秋季校园招聘
  19. autojs之浩然ocr-不安装插件就能用ocr
  20. 脑电图如何看,在临床上有哪些运用?

热门文章

  1. 卫星系统——酒店后端全链路日志收集工具介绍
  2. AI学习笔记--人机对话的四种形态
  3. 咨询笔记:麦肯锡7步成诗
  4. 介绍几个专门面向中文的命名实体识别和关系抽取工具
  5. centos 6.5 防火墙开放指定端口
  6. 2018-2019-2 网络对抗技术 20165332 Exp6 信息搜集与漏洞扫描
  7. 前端vue实现pdf文件的在线预览
  8. Object.prototype的成员介绍
  9. 2010年下半年软件评測师(下午)试题分析与解答
  10. codevs 1283 等差子序列