Hibernate高级查询
1. Query查询
HQL:Hibernate Query Language,Hibernate查询语言,和SQL语句类似,主要是面向对象的操作,将SQL语句的表名换成实体类的类名,将表中字段名替换为属性名。
查询步骤
① 编写hql查询语句(使用实体类);
② 获取Query对象(借助于session对象);
③ 执行查询操作
方法一:query.list(),查询是返回的结果是一个集合;
方法二:query.uniqueResult(),查询出来是一个唯一的结果,如果结果数大于1,则抛出异常org.hibernate.NonUniqueResultException。
注意
① 在HQL语句中不支持select*,但是聚合函数中可以;
② 在HQL语句中支持SQL语句中的所有的过滤条件查询;
③ 如果查询的不是所有的属性,则不能使用实体对象集合进行接收,返回的是一个Object类型的集合,如果是一个属性,则返回Object对象集合,如果多个则返回Object[]集合。
占位符的使用
① ?占位符:设置占位符从0开始;
String hql="from UserVo where userName=? ";
Query query=session.createQuery(hql);
query.setString(0, "小军");
② 引用占位符:给占位符设置一个名称;
语法:属性名=:占位符名
设置占位符时setXXXX(占位符名,值)
String hql="from UserVo where userName=:a ";
Query query=session.createQuery(hql);
query.setString("a", "小军");
HQL中分页查询
String hql="from UserVo";
//分页查询
Query query=session.createQuery(hql);
//设置查询的起始位置(当前页-1)*每一页显示的数量
query.setFirstResult(0);
//设置每一页显示的最大条数
query.setMaxResults(5);
List<UserVo> users=query.list();
for (UserVo userVo : users) {
System.out.println(userVo .getName());
}
2. Criteria查询
提供了一种面向对象的数据查询方式。
查询步骤
① 获取Criteria对象,通过Session获取;
//获取Criteria 对象
Criteria criteria=session.createCriteria(UserVo.class);
//查询所有的数据
List<UserVo> users=criteria.list();
for (UserVo userVo : users) {
System.out.println(userVo.getName());
System.out.println(userVo.getAge());
}
② 设置查询条件add();
使用Restrictions类中的静态方法进行条件的设置;
常见的静态的方法 | 说明 |
---|---|
eq(“属性名”,属性值) | 属性名=属性值 |
gt(“属性名”,属性值) | 属性名>属性值 |
lt(“属性名”,属性值) | 属性名<属性值 |
ge(“属性名”,属性值) | 属性名>=属性值 |
le(“属性名”,属性值) | 属性名<=属性值 |
between(“属性名”,下限,上限) | 属性名between下限and上限 |
like(“属性名”,”模式值”) | 属性名like模式值 |
in(“属性名”,集合/数组) | 属性名in(值,值,…) |
and(Criterion,Criterion) | 两个条件都要满足 |
or(Criterion,Criterion) | 满足其中一个条件 |
例如
Criteria criteria=session.createCriteria(BookVo.class);
//其中name要和Vo类中的属性名相对应
Criterion c1=Restrictions.eq("name", "aa");
Criterion c2=Restrictions.eq("age", 26);
criteria.add(Restrictions.and(c1, c2));
//criteria.add(Restrictions.eq("name", "aa"));
//criteria.add(Restrictions.eq("age", 26));
//返回唯一的一条记录的对象(要确保数据是唯一的)
//UserVo user=(UserVo) criteria.uniqueResult();
//System.out.println(user);
List<UserVo> users=criteria.list();
for (UserVo userVo : users) {
System.out.println(userVo.getName());
System.out.println(userVo.getAge());
}
添加聚合函数:setProjection();
常用聚合函数 | 说明 |
---|---|
Projections.count() | 总条目 |
Projections.sum(属性名) | 总和 |
Projections.avg(属性名) | 平均值 |
Projections.max(属性名) | 最大值 |
Projections.min(属性名) | 最小值 |
Projections.distinct(属性名) | 去重 |
例如
Criteria criteria=session.createCriteria(BookVo.class);
//查询所有num的和(通过聚合函数查询)
//criteria.setProjection(Projections.sum("num"));
//查询记录数
criteria.setProjection(Projections.count("age"));
List<Object> list=criteria.list();
for (Object object : list) {
System.out.println(object);
}
//进行分组查询
criteria.setProjection(Projections.groupProperty("age"));
List<Object> users=criteria.list();
for (Object userVo : users) {
System.out.println(userVo);
//System.out.println(userVo.getAge());
}
分页查询
Mysql分页SQL语句
select * from 表名 limit 起始位置,每页显示最大条数;
例如
Criteria criteria=session.createCriteria(UserVo.class);
//查询所有的数据
//List<UserVo> users=criteria.list();
//进行分页查询
//设置开始的位置
criteria.setFirstResult(0);
//设置每一页显示的条数
criteria.setMaxResults(5);
List<UserVo> users=criteria.list();
for (UserVo userVo : users) {
System.out.println(userVo.getName());
System.out.println(userVo.getAge());
}
③ 调用方法查询;
方法一:cr.list(),查询是返回的结果是一个集合;
方法二:cr.uniqueResult(),查询出来是一个唯一的结果,如果结果数大于1,则抛出异常org.hibernate.NonUniqueResultException。
下一篇:介绍Hibernate缓存机制
Hibernate缓存机制