Hibernate的查询介绍

一、对象导航查询

查询某个班级的所有学生的时候使用对象导航查询

//查询一班的所有同学
StuClass stuClass= session.get(StuClass.class, 1);
Set<Student> stuSet = stuClass.getStuSet();
System.out.println(stuSet);

二、OID查询

就是根据Id查询

StuClass stuClass= session.get(StuClass.class, 1);

三、HQL查询,使用Query对象

1>查询所有  

                        //查询所有学生
			 Query query = session.createQuery("from Student");
			 List<Student> stuList = query.list();
			 for(Student stu : stuList){
				 System.out.println(stu);
			 }

2>条件查询 

from 实体类名称 where 属性名=?

from 实体类名称 where 属性名 like ?

                        //模糊查询
			 Query query = session.createQuery("from Student where stuName like ? ");
			 query.setParameter(0, "%小%");
			 List<Student> stuList = query.list();
			 for(Student stu : stuList){
				 System.out.println(stu);
			 }

3>排序查询

from 实体类名称 order by 实体类属性名称 asc/desc

                         //排序查询
			 Query query = session.createQuery("from Student order by stuId ASC");
			 List<Student> stuList = query.list();
			 for(Student stu : stuList){
				 System.out.println(stu.getStuId() + "--" + stu.getStuName());
			 }

4>分页查询

hql操作中,在语句里面不能写limithibernateQuery对象封装两个方法实现分页操作


                         //分页查询
			 Query query = session.createQuery("from Student");
			 //设置初始位置
			 query.setFirstResult(0);
			 //设置最大结果数,即查询条目
			 query.setMaxResults(5);
			 List<Student> stuList = query.list();
			 for(Student stu : stuList){
				 System.out.println(stu.getStuId() + "--" + stu.getStuName());
			 }

5>投影查询

查询不是所有字段值,而是部分字段的值

                        //投影查询
			 Query query = session.createQuery("select stuId, stuName from Student");
			 List<Object> objectList = query.list();
			 for(Object o : objectList){
				 System.out.println(o);
			 }

6>聚集函数使用

常用聚集函数 

countsumavgmaxmin

                        //聚集函数查询:查询学生的个数
			 Query query = session.createQuery("select count(*) from Student");
			 //使用query.uniqueResult()方法得到结果,类型为object
			 Object o = query.uniqueResult();
			 //将Object强转为Long
			 Long lobj = (Long)o;
			 //得到整形
			 int count = lobj.intValue();
			 System.out.println(count);

四、QBC查询,使用criteria对象

使用hql查询时需要写hql语句,使用qbc不需要,使用方法实现

1>查询所有

	            //查询所有学生
			Criteria criteria = session.createCriteria(Student.class);
			List<Student> list = criteria.list();
			for(Student stu : list){
				System.out.println(stu.getStuId() + "==" + stu.getStuName() + ":::" + stu.getStuNo());
			}

2>条件查询

                       Criteria criteria = session.createCriteria(Student.class);
                         //条件查询,eq,查询名字为朱小兵的学生
			criteria.add(Restrictions.eq("stuName", "朱小兵"));
			
			//模糊查询,like,查询名字里有小的学生
			criteria.add(Restrictions.like("stuName", "%小%"));
                        List<Student> list = criteria.list();

3>排序查询

                        //排序查询,学号降序查询
			Criteria criteria = session.createCriteria(Student.class);
			criteria.addOrder(Order.desc("stuId"));
4>分页查询,和hql查询类似,有固定方法
	               //分页查询
			Criteria criteria = session.createCriteria(Student.class);
			criteria.setFirstResult(0);
			criteria.setMaxResults(5);

5>统计查询

	               //统计查询,查询数据条数
			criteria.setProjection(Projections.rowCount());
			//得到Object类型的结果
			Object obj = criteria.uniqueResult();
			//先强转为Long然后得到int
			Long lobj = (Long)obj;
			int count = lobj.intValue();
			System.out.println(count);

五、Hibernate的检索策略

Hibernate检索策略分为两种

1>立即查询

使用session.get()方法立即查询

2>延迟查询,根据id查询,还有load方法,调用load方法不会马上发送语句查询数据,只有得到对象里面的值时候才会发送语句查询数据库

session.load();

3> 延迟查询分成两类:

1)类级别延迟:根据id查询返回实体类对象,调用load方法不会马上发送语句

2)关联级别延迟:

1在映射文件中进行配置实现

1)根据班级得到所有的联系人,在班级映射文件中配置

 在set标签上使用属性

1fetch:值select(默认)

2lazy:值

- true:延迟(默认)

- false:不延迟

- extra:极其延迟


                        //查询一班
			StuClass stuClass = session.get(StuClass.class, 1);
			//得到set集合没有发送语句		
			Set<Student> stuSet = stuClass.getStuSet();
			//用到集合,发送语句
			System.out.println(stuSet);

六、批量抓取

查询每个班级,并查询出来每个班级的学生

                       //查询所有班级
			Criteria criteria  = session.createCriteria(StuClass.class);
			List<StuClass> stuClassList = criteria.list();
			//查询每个班级的学生
			for(StuClass stuClass : stuClassList ){
				System.out.println(stuClass.getcId() + "---" + stuClass.getcName());
				Set<Student> stuSet = stuClass.getStuSet();
				for(Student student : stuSet){
					System.out.println(student.getStuId() + "-----" + student.getStuId());
				}
			}
 <set name="stuSet" cascade="save-update,delete" inverse="true" batch-size="10">
在班级映射文件中设置batch=size的值,值越大发送语句次数越少

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值