// hql语句String hql ="from Student s where sex=:sex and s.grade.id=:grade_id order by id desc";// 创建hql查询Query query = session.createQuery(hql);// 设置hql参数
query.setParameter("sex",1);
query.setParameter("grade_id",1);// 查询返回实体对象集合List<Student> list = query.list();for(Student student : list){System.out.println(student.getName()+"、"+ student.getSex());}
2.2 hql分组统计查询
String hql ="select count(*) from Student s group by s.grade.id";Query query = session.createQuery(hql);//count()返回的是Long值List<Long> list= query.list();for(Long count : list){System.out.println(count);}
//迫切外连接:把主表和子表的数据都一次性查询出来//因为主表Grade对应着子表的多条记录,所以这里需要distinct去掉重复项String hql ="select distinct g from Grade g left join fetch g.students";Query query = session.createQuery(hql);//把子表所有数据封装到主表的students属性中List<Grade> list = query.list();for(Grade grade : list){System.out.println(grade.getName());Set<Student> students = grade.getStudents();for(Student student : students){System.out.println(student.getName());}}
2.6 子查询
all
如果当前筛选all子查询内返回0条记录,任何判断符号,该判断都为true
如果当前筛选all子查询内返回1条或以上记录,则返回的所有记录都符合条件才为true
//查询所有成绩都及格的学生(没有成绩的学生也不查询)//如果不加s.results.size>0这个额外条件,没有成绩的学生也会被查询到//因为没有成绩的学生all()没有返回记录,所以无论60>还是60<都是为truefrom Student s where60<all(select r.score from s.results r)and s.results.size>0
//查询有一次或以上成绩及格的学生from Student s where60<any(select r.score from s.results r)
exists
返回一条或以上记录则为true,返回0条记录则为false
3.原生SQL查询
//SQL语句、{s.*}标识一个对象的所有属性、可以使用占位符String sql="select {s.*},{g.*} from Student s join Grade g on g.id=s.grade_id";//使用createSQLQuery()调用SQL查询语句,返回SQLQuery类型,继承Query接口SQLQuery query=session.createSQLQuery(sql);//addEntity()可以把返回结果封装成对象,第一个参数是SQL查询语句中Student的别名s,第二个参数是需要封装成的类Student.class//addJoin()可以连接查询的对象封装成对象,第一个参数是SQL查询语句中被连接的表的别名g,第二个参数是Student类的grade属性,是个字符串
query.addEntity("s",Student.class).addJoin("g","s.grade");//返回值是一个Object数组集合,数组的第一个元素是Student对象,数组第二个元素是Grade对象List<Object[]> list = query.list();for(Object[] objects : list){Student student=(Student) objects[0];Grade grade=(Grade)objects[1];System.out.println(student.getName()+","+grade.getName());}}