JPA中,QBC查询,JpaSpecificationExecutor,Specification总结

class Specification {public static void main(String[] args) {// 底层实现原理,Specification接口底层就是利用EntityManager实现EntityManager entityManager = SpringUtil.getBean(EntityManager.class);// 固定套路,总共十一步// 第一步: 获取条件构造器CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();// 第二步: 构造标准查询API,这里使用Object[]而不是使用User是因为下面有别名,函数的情况,所以用实体无法接收,还有很多的方式CriteriaQuery<Object[]> criteriaQuery = criteriaBuilder.createQuery(Object[].class);// 第三步: 指定查询的根实体,说白了就是主表内容,Root就表示主表的字段信息Root<User> root = criteriaQuery.from(User.class);// 第四步(可选): 多表关联,User表与IdCard表关联,使用的都是属性名,自动设置连接条件Join<User, IdCard> join = root.join("idCard", JoinType.LEFT);// 如果设置一对多,或者多对多,使用joinCollection// Join<User, Address> join = root.joinCollection("idCard", JoinType.LEFT);// 第四-五步: 要查询的字段汇总// 查询所有// criteriaQuery.select(root);// 查询指定字段和使用聚合函数并且取别名// 给字段取别名,记得接受结果的返回值的属性需要对应上// 注意: 控制台打印的SQL没有取别名,Hibernate生成的SQL语句不会包含Criteria API中设置的别名Selection<String> name = root.get("name").as(String.class).alias("name");Selection<Integer> age = root.get("age").as(Integer.class).alias("age");// 给聚合函数取别名Expression<Long> count = criteriaBuilder.count(root.get("age"));criteriaBuilder.construct(Long.class, count.alias("count"));// 查询字段,其中,root表示主表select root.*,join表示关联表select join.*criteriaQuery.multiselect(root, join, name, age, count);// 第五步: 构建条件并设置条件,tip: 下面criteriaQuery操作实际上不区分先后顺序// 如果要设置主表的字段条件,使用root.get("字段名")// 如果要设置关联表的字段条件,join.get("字段名")Predicate rootIsDelete = criteriaBuilder.isFalse(join.get("deleted"));Predicate idCardDelete = criteriaBuilder.isFalse(root.get("deleted"));// 如果要使用and,或or,直接使用conjunction,disjunction,构建一个空条件Predicate,然后在进行拼接和and,or方法是一样的Predicate andEmptyPredicate = criteriaBuilder.conjunction();// 构造条件Predicate nameEqualPredicate = criteriaBuilder.equal(root.get("name"), "luck");Predicate ageGePredicate = criteriaBuilder.ge(root.get("age"), 10);// 将构造条件统一存入到空的Predicate,并且他们使用and连接// user.name = 'luck' and user.age >= 10andEmptyPredicate.getExpressions().add(nameEqualPredicate);andEmptyPredicate.getExpressions().add(ageGePredicate);// 上面两行代码等于下面一行代码// user.name = 'luck' and user.age >= 10Predicate andPredicate = criteriaBuilder.and(nameEqualPredicate, ageGePredicate);// 将构造条件统一存入到空的Predicate,并且他们使用or连接// user.name = 'luck' or user.age >= 10Predicate orEmptyPredicate = criteriaBuilder.disjunction();orEmptyPredicate.getExpressions().add(nameEqualPredicate);orEmptyPredicate.getExpressions().add(ageGePredicate);// 上面两行代码等于下面一行代码// user.name = 'luck' or user.age >= 10Predicate orPredicate = criteriaBuilder.or(nameEqualPredicate, ageGePredicate);// 如果要实现 (x1) or (x2)这种情况,那么x1和x2都是一个使用and连接的Predicate,然后x1和x2使用or连接Predicate twoAndOrPredicate = criteriaBuilder.or(andPredicate, andEmptyPredicate);// 嵌套也是一样的(x1 or x2) and (x3 or x4)// 步骤1: x1和x2对应Predicate使用or进行连接,结果为x1x2// 步骤2: x3和x4对应Predicate使用or进行连接,结果为x3x4// 步骤3: 再将步骤一结果和步骤二结果x1x2与x3x4使用and进行连接得到x1x2Andx3x4,最终作为结果// (user.name = ? or username = ?) and (user.age >= 100 or user.age < 10)Predicate x1 = criteriaBuilder.equal(root.get("name"), "luck");Predicate x2 = criteriaBuilder.equal(root.get("name"), "java");Predicate x1x2 = criteriaBuilder.or(x1, x2);Predicate x3 = criteriaBuilder.ge(root.get("age"), 100);Predicate x4 = criteriaBuilder.lt(root.get("age"), 10);Predicate x3x4 = criteriaBuilder.or(x3, x4);Predicate x1x2Andx3x4 = criteriaBuilder.and(x1x2, x3x4);// 以上所有构建的条件都可以使用上,这个就是为了说明sql,上面构造的条件意义不大criteriaQuery.where(rootIsDelete, idCardDelete, orPredicate, twoAndOrPredicate, x1x2Andx3x4);// 第六步(可选): 构造分组条件并设置// 指定字段分组,可以有多个criteriaQuery.groupBy(root.get("age"));// 第七步(可选): 构造分组后条件并设置// 这个和上面讲的where一样criteriaQuery.having();// 第八步(可选): 构造排序条件并设置// 指定排序字段,并且设置排序方式criteriaQuery.orderBy(criteriaBuilder.asc(root.get("age")));// 第九步: 使用标准查询API(CriteriaQuery)构建一个可执行标准查询的Query对象TypedQuery<Object[]> query = entityManager.createQuery(criteriaQuery);// 第十步(可选): 设置分页参数,limit 1,10query.setFirstResult(1).setMaxResults(10);// 第十一步: 执行查询,获取结果List<Object[]> users = query.getResultList();for (Object[] user : users) {for (Object u : user) {System.out.print(u + ",");}System.out.println();}System.out.println(users);}
}

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

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

相关文章

文件操作C

1、什么是文件 在程序设计中,我们一般谈的文件有两种:程序文件,数据文件(从文件功能的角度来分类的。) 11程序文件 包括源程序文件(后缀为.c),目标问价(windows环境后缀为.obj),可执行程序(Windows环境后缀为.exe)。 12数据文件 文件的内容不一定是程序,而是程序…

[C#]OpenCvSharp实现直方图均衡化全局直方图局部直方图自适应直方图

【什么是直方图均衡化】 直方图均衡化是一种简单而有效的图像处理技术&#xff0c;它旨在改善图像的视觉效果&#xff0c;使图像变得更加清晰和对比度更高。其核心原理是将原始图像的灰度直方图从可能较为集中的某个灰度区间转变为在全部灰度范围内的均匀分布。通过这种方法&a…

AI学习-线性回归推导

线性回归 1.简单线性回归2.多元线性回归3.相关概念熟悉4.损失函数推导5.MSE损失函数 1.简单线性回归 ​ 线性回归&#xff1a;有监督机器学习下一种算法思想。用于预测一个或多个连续型目标变量y与数值型自变量x之间的关系,自变量x可以是连续、离散&#xff0c;但是目标变量y必…

简述JavaScript入门:掌握网络编程的关键

在数字时代&#xff0c;编程不仅是专业人士的技能&#xff0c;也越来越成为日常生活的一部分。JavaScript&#xff0c;作为最流行的编程语言之一&#xff0c;主要用于网页和网络应用开发。无论是个人兴趣&#xff0c;还是职业发展&#xff0c;学习JavaScript都是一个明智的选择…

Visual Studio 配置代码风格审查工具cpplint

文章目录 一、Visual Studio 配置代码风格审查工具cpplint1、安装2、运行3、集成到Visual Studio4、集成到Git 前言 cpplint是一个用于检查C代码风格的工具&#xff0c;它可以帮助我们发现潜在的编码问题&#xff0c;提高代码质量。cpplint遵循Google的C编码规范&#xff0c;通…

快速获取文件夹及其子文件夹下的所有文件名

1、在文件夹中新建文本文档&#xff0c;命名为“命令.txt” 2、输入以下内容 tree /F > 文件名.txt dir *.* /B > 文件名.txt 其中文件名和文件格式可以是任意的&#xff0c;tree命令可生成文件及其子文件夹下所有文件的名称&#xff0c;dir命令只生成当前目…

用wordpress搭建视频点播发布平台

目录 一、安装操作系统、宝塔面板 二、宝塔面板部署环境 1、安装nginx

技术驱动下的同城O2O发展:跑腿配送APP开发教学

在同城生活服务领域&#xff0c;跑腿配送APP的出现与发展&#xff0c;为人们的日常生活提供了极大的便利。今天&#xff0c;小编将着重为大家讲解技术驱动下的同城O2O发展&#xff0c;并从跑腿配送APP的开发角度进行教学和解析。 一、同城O2O发展概述 在同城O2O模式中&#x…

20240323-2-决策树面试题DecisionTree

决策树面试题 1. 简单介绍决策树算法 决策树算法是一种逼近离散函数值的方法。它是一种典型的分类方法&#xff0c;首先对数据进行处理&#xff0c;利用归纳算法生成可读的规则和决策树&#xff0c;然后使用决策对新数据进行分析。本质上决策树是通过一系列规则对数据进行分类…

BCLinux-for-Euler配置本地yum源

稍微吐槽一句…… 在这片土地上&#xff0c;国产化软件的大潮正在滚滚而来&#xff0c;虽然都不是真正意义上的国产化&#xff0c;但是至少壳是国产的~~~ 之前使用的Centos7的系统&#xff0c;现在都要求统一换成BCLinux-for-Euler。说实话换了之后不太适应&#xff0c;好多用习…

四月软件测试面经合集(持续更新)

四月软件测试面经合集 polelink面试&#xff08;一面过&#xff09;01 对于JMeter接口测试&#xff0c;如何做接口关联&#xff1f;接口关联的定义JMeter关联方法正则表达式介绍贪婪匹配和非贪婪匹配案例分析正则表达式提取器步骤 02 是否会写shell脚本&#xff0c;能对shell进…

JVM—类加载子系统

JVM—类加载子系统 JVM的类加载是通过ClassLoader及其子类来完成的。 有哪些类加载器 类加载器如下&#xff1a; 启动类加载器&#xff08;BootStrap ClassLoader&#xff09;&#xff1a;负责加载JAVA_HOME\lib目录或通过-Xbootclasspath参数指定路径中的且被虚拟机认可&am…

【leetcode面试经典150题】2.移除元素(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主&#xff0c;题解使用C语言。&#xff08;若有使用其他语言的同学也可了解题解思路&#xff0c;本质上语法内容一致&…

FaaF:利用事实作为评估RAG的函数方法

原文地址&#xff1a;faaf-facts-as-a-function-for-evaluating-rag 2024 年 4 月 5 日 在某些情况下&#xff0c;我们使用其他语言模型来验证RAG的输出结果&#xff0c;但这种方法并未能有效识别出数据生成过程中的错误和缺失。 论文解析 挑战 评估的可靠性和效率&#xff…

4月底,这门HCIA认证即将发布!

非常荣幸地通知您&#xff0c;华为认证HCIA-AI Solution V1.0&#xff08;中文版&#xff09;预计将于2024年4月30日正式对外发布。 为了帮助您做好学习、培训和考试计划&#xff0c;现进行预发布通知&#xff0c;请您关注。 01 发布概述 基于“平台生态”战略&#xff0c;围绕…

练习题(2024/4/6)

1最接近的三数之和 给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数&#xff0c;使它们的和与 target 最接近。 返回这三个数的和。 假定每组输入只存在恰好一个解。 示例 1&#xff1a; 输入&#xff1a;nums [-1,2,1,-4], target …

并查集python实现及题目练习

文章目录 1. 并查集概念1.1 理解并查集&#xff1a;简介与应用场景1.2 Python 实现并查集及优化策略1.3 扁平化栈实现1.4 分析并查集的时间复杂度 2. 情侣牵手3. 相似字符串4. 岛屿数量 如果想了解并查集基础推荐去看左程云大神的算法讲解&#xff0c;非常不错&#xff0c;b站和…

python 02字符串

字符串可能是用到最多的数据类型了&#xff0c;所有标准序列操作&#xff08;索引、切片、乘法、成员资格检查、长度、最小值和最大值&#xff09;都适用于字符串 但别忘了字符串是不可变的&#xff0c;因此所有的元素赋值和切片赋值都是非法的。 1.居中效果 默认为空格 可…

在不同操作系统中搭建Python编程环境

1 在不同操作系统中搭建Python编程环境 1.1 在Linux系统中搭建Python编程环境 1. 检查Python版本 在你的系统中运行应用程序Terminal&#xff08;如果你使用的是Ubuntu&#xff0c;可按Ctrl Alt T&#xff09;&#xff0c;打开一个终端窗口。为确定是否安装了Python&…

能源党建后台项目总结

1.引入 本次框架是Ruoyi-plusvue2element组合。 2.样式 由于是后台项目&#xff0c;样式要求统一&#xff0c;不可以有的输入框长有的短。着重几点&#xff1a; 1.关于form表单应该如何水平布局 在element中&#xff0c;form有个属性叫&#xff1a;:inline"true"…