一、对象导航查询
查询某个班级的所有学生的时候使用对象导航查询
//查询一班的所有同学
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操作中,在语句里面不能写limit,hibernate的Query对象封装两个方法实现分页操作
//分页查询
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>聚集函数使用
常用聚集函数
count、sum、avg、max、min
//聚集函数查询:查询学生的个数
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标签上使用属性
(1)fetch:值select(默认)
(2)lazy:值
- 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的值,值越大发送语句次数越少