Hibernate使用教程(三)

Hibernate查询

一、SQL查询

SQLQuery是Hibernate提供的SQL查询对象(5.2以前)
NativeQuery是Hibernate提供的SQL查询对象,通过sql语句执行查询,可查询一个集合或者一个对象。(5.2以后)
使用过程:
创建NativeQuery 对象:
NativeQuery query=session.createNativeQuery(sql,Class c);
第一个参数sql:表示本次查询执行的sql语句
第二个参数Class:表示本次执行查询结果封装的实体类对象
NativeQuery query=session.createNativeQuery(sql);
参数sql:表示本次执行查询的sql语句
如果要指定本次查询结果封装的实体类对象需要执行以下方法:
query.addEntity(Class c);
SQL语句中的动态参数处理:
SQL语句可以采用?或者:参数名称的方式来为动态参数占位,例如:
String sql=”select * from student where name like ? and age>?”;
使用?作为占位符以后可以使用query.setParameter(序号,值);的方式来为占位符赋值,值得注意的是占位符从1开始。(推荐)
使用?作为占位符以后可以使用query.setXxx(序号,值);的方式来为占位符赋值,值得注意的是占位符从1开始。
使用:参数名称作为占位符以后可以使用query.setXxx(“参数名称”,值);的方式来为占位符赋值
使用:参数名称作为占位符以后还可以使用query.setProperties(Map map)的方式来为所有命名参数同时赋值,需要保证键值对和命名参数名称一致。(推荐)
如果要分页查询在执行查询前需要先执行两个方法:
query.setFirstResult(); 设置起始位置从0开始
query.setMaxResult(); 设置查询总行数
查询数据并将查询出的结果封装为集合:query.getResultList();
查询数据并将查询出的数据封装为一个实体类对象:query.uniqueResult();

二、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对象:
Query query=session.createuery(hql);
使用:参数名称作为占位符以后可以使用query.setParameter(“参数名称”,值)或者query.setXxx(“参数名称”,值);的方式来为占位符赋值
使用:参数名称作为占位符以后还可以使用query.setProperties(Map map)以及query.setProperties(实体类udixiang)的方式来为所有命名参数同时赋值,使用键值对需要保证键和命名参数名称一致,使用实体类需要保证命名参数名称与实体类属性一致。

如果要分页查询在执行查询前需要先执行两个方法:
query.setFirstResult(); 设置起始位置从0开始
query.setMaxResult(); 设置查询总行数
查询数据并将查询出的结果封装为集合:query.list();
查询数据并将查询出的数据封装为一个实体类对象:query.uniqueResult();

三、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对象:
Criteria cri=session.createCriteria(Student.class);
参数:表示需要查询表对应的的实体类
设置查询条件:(可选)
使用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(”别名”):当我们要使用聚合函数的结果来排序时,可以给聚合函数的投影结果定义别名,最后通过该别名来实现排序
Projections.projectionList():创建一个投影查询对象集合,一个集合可以保存多个投影查询项对象
projectionList.add(Projection对象):将投影查询对象添加到投影查询集合中
projectionList.add(Projection对象,字符串):将投影查询对象添加到查询集合中,并为其添加别名
Projections.groupProperty(String propertyName):分组
criteria.setProjection(Projection对象):将投影查询项设置Criteria中
设置排序方式:(可选)
criteria.addOrder(Order.asc(“属性名或者别名”)):升序
criteria.addOrder(Order.desc(“属性名或者别名”)):降序
设置分页:(可选)
criteria.setFirstResult(); 设置起始位置从0开始
criteria.setMaxResult(); 设置查询总行数
执行查询:
criteria.list();
criteria.uniqueResult();
重要API(5.2以后):

CriteriaQuery:查询接口,用于添加查询条件,分组,排序,投影查询
CriteriaBuilder:创建查询接口的建造者类,用于创建CriteriaQuery对象、查询条件对象、投影查询表达式对象。
Root:根据属性名称获取字段名称,字段名称可以用于查询条件和投影查询中
Predicate:条件对象
Expression:表达式对象,用于表达投影查询的字段,条件中的字段名称
使用过程(5.2以后):
创建查询对象
CriteriaBuilder criteriaBuilder = session.getCriteriaBuilder();
CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Class c);
Root root=criteriaQuery .from(Class c);
注意:在创建查询接口CriteriaQuery时,可以指定最终查询出的数据类型,定义好之后后续查询出的数据不需要在进行强转。
设置查询条件(可选):
创建查询条件:
criteriaBuilder.equals(root.get(“字段名”),值);
criteriaBuilder.and();
criteriaBuilder.or();
添加查询条件
criteriaQuery.where();
设置投影查询(可选):
创建投影查询项:
创建字段投影查询项:
root.get(“字段名称”)
创建聚合函数投影查询项
criteriaBuilder.avg(root.get(“age”));
添加投影查询项:
criteriaQuery.select(投影查询项对象);
criteriaQuery.multiselect(投影查询项对象1,投影查询项对象2…);
设置分组(可选):
criteriaQuery.groupBy(root.get(""));
设置排序(可选):
创建排序对象:
根据字段升序:
criteriaBuilder.asc(root.get(""));
根据聚合函数升序:
criteriaBuilder.asc(criteriaBuilder.avg(root.get("")));

根据字段降序:
criteriaBuilder.desc(root.get(""));
根据聚合函数降序:
criteriaBuilder.desc(criteriaBuilder.avg(root.get("")));
添加排序:
criteriaQuery.orderBy()
封装Query对象:
Query query=session.createQuery(criteriaQuery);
分页查询(可选):
query.setFirstResult(); 设置起始位置从0开始
query.setMaxResult(); 设置查询总行数
执行查询:
query.getResultList();
query.getSingleResult();
同样的,投影查询的单个结果以Object封装,多个结果用Object数组封装

无论你在学习上有任何问题,重庆蜗牛学院欢迎你前来咨询,联系QQ:296799112

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值