java框架开发技术篇2---Hibernate高级查询

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缓存机制

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值