09
07

Java开发|Hibernate5.0使用教程(三)

20210623_110516_938.jpg


苟耀:蜗牛学院高级讲师,11年Java开发和教学经验。专攻Java Web开发,具备全栈开发能力,精通JavaScript、Bootstrap、jQuery、Mybatis、SpringMVC、Spring、Springboot、Mysql等Web开发相关技术,对框架底层原理有深入的理解。授课风趣幽默, 注重逻辑善于从技术原理出发,授之以渔。

01

SQL查询



SQLQuery是Hibernate提供的SQL查询对象(5.2以前)

NativeQuery是Hibernate提供的SQL查询对象,通过sql语句执行查询,可查询一个集合或者一个对象。(5.2以后)

使用过程:

创建NativeQuery 对象:

  • 20210709_142146_242.jpg

第一个参数sql:表示本次查询执行的sql语句

第二个参数Class:表示本次执行查询结果封装的实体类对象

  • 20210709_142155_750.jpg

参数sql:表示本次执行查询的sql语句

如果要指定本次查询结果封装的实体类对象需要执行以下方法:

  • 20210709_142204_082.jpg

SQL语句中的动态参数处理:

SQL语句可以采用?或者:参数名称的方式来为动态参数占位,例如:

  • 20210709_142212_358.jpg

使用?作为占位符以后可以使用query.setParameter(序号,值);的方式来为占位符赋值,值得注意的是占位符从1开始。(推荐)

使用?作为占位符以后可以使用query.setXxx(序号,值);的方式来为占位符赋值,值得注意的是占位符从1开始。

使用:参数名称作为占位符以后可以使用query.setXxx(“参数名称”,值);的方式来为占位符赋值

使用:参数名称作为占位符以后还可以使用query.setProperties(Map map)的方式来为所有命名参数同时赋值,需要保证键值对和命名参数名称一致。(推荐)

如果要分页查询在执行查询前需要先执行两个方法:

  • 20210709_142220_508.jpg


查询数据并将查询出的结果封装为集合:

  • 20210709_142228_029.jpg

查询数据并将查询出的数据封装为一个实体类对象:

  • 20210709_142234_764.jpg


02

HQL查询


HQL全称Hibernate Query Language,是Hibernate设计的面向对象的查询语言,使用HQL查询数据时与数据库的种类和版本无关,Hibernate最终会根据方言将HQL转为SQL去数据库中执行查询。同时HQL语法和SQL非常类似,非常易于学习和使用,是Hibernate推荐的查询方式之一。

HQL查询语句中只能出现类名和属性名,不能出现表名和字段名,不能出现*;

HQL查询语句中出现的类名,必须是进行了对象关系映射的类,没有映射的类不能出现在HQL语句中;

HQL查询语句中如果要使用别名,必须使用as关键字,不能省略。

HQL语法结构:

select

属性列表、聚合函数、投影查询

from 类名

Inner join 类 on 连接条件

where 条件

group by 属性名称 having 条件

order by 属性名称 desc/asc

查询语句示例:

查询所有数据:

查询学生表的所有学生对象:from Student (不能写成select * from Student)

投影查询(查询表的一部分字段或者聚合函数):

查询学生表中的学生姓名属性:select name from Student(当查询的是单个属性时,查询的集合中保存的就是该属性值)

查询学生表中的学生姓名和年龄:select name,age from Student (当查询的是多个属性时,查询的集合中保存的是Object数组,一个数组表示一行数据)

查询学生表中的学生姓名和年龄并封装为学生类对象:select new Student(name,age)from Student

(学生类中需要提供对应的带参构造函数)。

where子句:别名需要加as

where子句可以对数据进行筛选,查询出满足条件的数据,具体的条件判断方式和SQL类似。

如:>、<、>=、<=、=、<>、is null、 is not null、 in、 between and、like

group by having子句:

分组子句用法和SQL一致

order by子句:

排序子句用法和SQL一致

使用过程:

创建Query对象:

  • 20210709_142300_812.jpg

使用:参数名称作为占位符以后可以使用query.setParameter(“参数名称”,值)或者query.setXxx(“参数名称”,值);的方式来为占位符赋值

使用:参数名称作为占位符以后还可以使用query.setProperties(Map map)以及query.setProperties(实体类udixiang)的方式来为所有命名参数同时赋值,使用键值对需要保证键和命名参数名称一致,使用实体类需要保证命名参数名称与实体类属性一致。


如果要分页查询在执行查询前需要先执行两个方法:

  • 20210709_142312_738.jpg

查询数据并将查询出的结果封装为集合:

  • 20210709_142319_179.jpg

查询数据并将查询出的数据封装为一个实体类对象:

  • 20210709_142327_011.jpg

03

Criteria查询


Criteria是Hibernate提出的纯粹的面向对象的查询方式,在使用Criteria查询数据时,不需要书写任何一个SQL语句或者HQL语句,即时是一个完全不懂SQL的人,也完全可以使用Criteria所提供的的各种API来设置查询条件、分页、排序、联合查询等等,也依然可以使用Criteria查询出想要的数据。


重要API(5.2以前):

Criteria(5.2版本以前):标准查询接口,通过该接口来执行查询、添加条件等等。

Criterion:Criterion是 Criteria 的查询条件。Criteria 提供了 add(Criterion criterion) 方法来

添加查询条件。

Restrictions :Restrictions 类中提供了大量的静态方法用于产生Criterion条件对象

Projection:Projection用来描述一个投影查询项,一个Projection对象就是一个投影查询项

ProjectionList:ProjectionList是投影查询集合,用来描述多个投影查询项,可以使用Criteria的setProjection方法添加投影查询项

Projections:Projections类中提供了大量的静态方法用于产生Projection投影查询项

Order:描述排序方式

使用过程(5.2以前):

创建Criteria对象:

  • 20210709_142334_729.jpg

参数:表示需要查询表对应的的实体类

设置查询条件:(可选)

使用Restrictions的静态方法可以快速生成查询条件对象Criterion

Restrictions.eq :equal,等于.

Restrictions.gt :great-than > 大于

Restrictions.ge :great-equal >= 大于等于

Restrictions.lt :less-than, < 小于

Restrictions.le :less-equal <= 小于等于

Restrictions.between:对应SQL的between子句

Restrictions.like :对应SQL的LIKE子句

Restrictions.in :对应SQL的in子句

Restrictions.isNull :判断属性是否为空,为空则返回true

Restrictions.and :and 关系

Restrictions.or :or 关系

查询条件对象定义好之后需要将查询条件添加到Criteria对象中

criteria.add(查询条件对象)


设置投影查询项:(可选)

创建投影查询项:

Projections.property(“属性名”):创建一个投影查询项为一个属性的Projection对象

Projections.avg(String propertyName):求平均值的投影查询对象

Projections.count(String propertyName):求属性出现次数总和的投影查询对象

Projections.max(String propertyName):求属性最大值的投影查询对象

Projections.min(String propertyName):求最小值的投影查询对象

Projections.sum(String propertyName):求和的投影查询对象

Projections.聚合函数(String propertyName,”别名”):当我们要使用聚合函数的结果来排序时,可以给聚合函数的投影结果定义别名,最后通过该别名来实现排序

Projections.聚合函数(String propertyName).as(”别名”):当我们要使用聚合函数的结果来排序时,可以给聚合函数的投影结果定义别名,最后通过该别名来实现排序

  • 20210709_142345_523.jpg

创建一个投影查询对象集合,一个集合可以保存多个投影查询项对象


  • 20210709_142352_397.jpg

将投影查询对象添加到投影查询集合中


  • 20210709_142358_013.jpg

将投影查询对象添加到查询集合中,并为其添加别名


  • 20210709_142410_467.jpg

设置排序方式:(可选)

  • 20210709_142430_351.jpg

设置分页:(可选)

  • 20210709_142437_208.jpg

执行查询:


  • 20210709_142445_829.jpg

重要API(5.2以后):


CriteriaQuery:查询接口,用于添加查询条件,分组,排序,投影查询

CriteriaBuilder:创建查询接口的建造者类,用于创建CriteriaQuery对象、查询条件对象、投影查询表达式对象。

Root:根据属性名称获取字段名称,字段名称可以用于查询条件和投影查询中

Predicate:条件对象

Expression:表达式对象,用于表达投影查询的字段,条件中的字段名称

使用过程(5.2以后):

创建查询对象


  • 20210709_142455_742.jpg



注意:在创建查询接口CriteriaQuery时,可以指定最终查询出的数据类型,定义好之后后续查询出的数据不需要在进行强转。

设置查询条件(可选):

创建查询条件:


  • 20210709_142504_674.jpg

添加查询条件

  • 20210709_142513_772.jpg

设置投影查询(可选):

创建投影查询项:

创建字段投影查询项:

root.get(“字段名称”)

创建聚合函数投影查询项

  • 20210709_142752_763.jpg

添加投影查询项:

  • 20210709_142810_609.jpg


设置分组(可选):

  • 20210709_142819_381.jpg

设置排序(可选):

创建排序对象:

根据字段升序:

  • 20210709_142827_836.jpg

根据聚合函数升序:

  • 20210709_142836_118.jpg


根据字段降序:

  • 20210709_142843_448.jpg


根据聚合函数降序:

  • 20210709_142851_065.jpg

添加排序:

  • 20210709_142859_900.jpg

封装Query对象:

  • 20210709_142907_455.jpg

分页查询(可选):

  • 20210709_143548_451.jpg

 设置起始位置从0开始

  • 20210709_143557_913.jpg

 设置查询总行数


执行查询:

  • 20210709_143609_402.jpg

同样的,投影查询的单个结果以Object封装,多个结果用Object数组封装。




版权所有,转载本站文章请注明出处:蜗牛学苑, https://www.woniuxy.cn/article/1427