// 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