SQLQuery是Hibernate提供的SQL查询对象(5.2以前)
NativeQuery是Hibernate提供的SQL查询对象,通过sql语句执行查询,可查询一个集合或者一个对象。(5.2以后)
使用过程:
创建NativeQuery 对象:
第一个参数sql:表示本次查询执行的sql语句
第二个参数Class:表示本次执行查询结果封装的实体类对象
参数sql:表示本次执行查询的sql语句
如果要指定本次查询结果封装的实体类对象需要执行以下方法:
SQL语句中的动态参数处理:
SQL语句可以采用?或者:参数名称的方式来为动态参数占位,例如:
使用?作为占位符以后可以使用query.setParameter(序号,值);的方式来为占位符赋值,值得注意的是占位符从1开始。(推荐)
使用?作为占位符以后可以使用query.setXxx(序号,值);的方式来为占位符赋值,值得注意的是占位符从1开始。
使用:参数名称作为占位符以后可以使用query.setXxx(“参数名称”,值);的方式来为占位符赋值
使用:参数名称作为占位符以后还可以使用query.setProperties(Map map)的方式来为所有命名参数同时赋值,需要保证键值对和命名参数名称一致。(推荐)
如果要分页查询在执行查询前需要先执行两个方法:
查询数据并将查询出的结果封装为集合:
查询数据并将查询出的数据封装为一个实体类对象:
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对象:
使用:参数名称作为占位符以后可以使用query.setParameter(“参数名称”,值)或者query.setXxx(“参数名称”,值);的方式来为占位符赋值
使用:参数名称作为占位符以后还可以使用query.setProperties(Map map)以及query.setProperties(实体类udixiang)的方式来为所有命名参数同时赋值,使用键值对需要保证键和命名参数名称一致,使用实体类需要保证命名参数名称与实体类属性一致。
如果要分页查询在执行查询前需要先执行两个方法:
查询数据并将查询出的结果封装为集合:
查询数据并将查询出的数据封装为一个实体类对象:
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对象:
参数:表示需要查询表对应的的实体类
设置查询条件:(可选)
使用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(”别名”):当我们要使用聚合函数的结果来排序时,可以给聚合函数的投影结果定义别名,最后通过该别名来实现排序
创建一个投影查询对象集合,一个集合可以保存多个投影查询项对象
将投影查询对象添加到投影查询集合中
将投影查询对象添加到查询集合中,并为其添加别名
设置排序方式:(可选)
设置分页:(可选)
执行查询:
重要API(5.2以后):
CriteriaQuery:查询接口,用于添加查询条件,分组,排序,投影查询
CriteriaBuilder:创建查询接口的建造者类,用于创建CriteriaQuery对象、查询条件对象、投影查询表达式对象。
Root:根据属性名称获取字段名称,字段名称可以用于查询条件和投影查询中
Predicate:条件对象
Expression:表达式对象,用于表达投影查询的字段,条件中的字段名称
使用过程(5.2以后):
创建查询对象
注意:在创建查询接口CriteriaQuery时,可以指定最终查询出的数据类型,定义好之后后续查询出的数据不需要在进行强转。
设置查询条件(可选):
创建查询条件:
添加查询条件
设置投影查询(可选):
创建投影查询项:
创建字段投影查询项:
root.get(“字段名称”)
创建聚合函数投影查询项
添加投影查询项:
设置分组(可选):
设置排序(可选):
创建排序对象:
根据字段升序:
根据聚合函数升序:
根据字段降序:
根据聚合函数降序:
添加排序:
封装Query对象:
分页查询(可选):
设置起始位置从0开始
设置查询总行数
执行查询:
同样的,投影查询的单个结果以Object封装,多个结果用Object数组封装。