其中HQL和QBC是Hibernater提供的專業的查詢方式
HQL查詢方式為官方推薦的標準查詢方式
二、HQL查詢簡述HQL:Hibernate Query Language
這種語言看上去很像SQL。但是不要被語法結構 上的相似所迷惑,HQL是非常有意識的被設計為完全面向對象的查詢,它可以理解如繼承、多態 和關聯之類的概念。
例如:
//1.得到session Session session=HibernateSessionFactory.getSession(); //2。創建查詢語句這里的Student為持久化類的,類名 String hql="from Student"; //String hql="from Student where sname='張三'"; //3.創建Query對象 Query query=session.createQuery(hql); //4.執行查詢 返回結果為list集合 List<Student> list=query.list(); //5.輸出結果 for (Student stu : list) { System.out.PRintln(stu.getSname()+stu.getSex()); }三、最簡單的查詢
查詢全部信息
from Student //直接使用持久化類名from com.pb.entity.Student //使用全路徑
通常我們不需要使用類的全限定名, 因為auto-import(自動引入) 是缺省的情況。
也可以為類名指定別名
from Student as s //使用as 關鍵字指定類的別名from Student s //省略as 關鍵字指定類的別名四、where子句
也可以支持where子句
from Student where sid=201503011from Student s where s.sid=2015030114.1、在where中可以使用各種運算符

例如:
from Student where sex='男' and sid<11070200//查詢學生性別 為男同時,學號小于 11070200的學生from Student where sid between 11070100 and 11070200//查詢學生學號在11070100 and 11070200之間的學生from Student where snamelike '%飛';//查詢學生姓名最后一個字為飛的全部學生from Student where sname like '_ik*';//查詢學生姓名,第一個字為任意,第2個為i,第3個為k,后面任意長度的學生
其中"-"匹配單個字符
"%"匹配任意長度的字符
"_"不可以進行漢字匹配,"%"可以進行漢字匹配
五、返回結果Query的方法
5.1、list()方法//1.得到session Session session=HibernateSessionFactory.getSession(); //2。創建查詢語句這里的Student為持久化類的,類名 String hql="from Student"; //String hql="from Student where sid=201503011 "; //3.創建Query對象 Query query=session.createQuery(hql); //4.執行查詢 返回結果為list集合 List<Student> list=query.list(); //5.輸出結果 for (Student stu : list) { System.out.println(stu.getSname()+stu.getSex()); }5.2、iterate()方法//1.得到session Session session=HibernateSessionFactory.getSession(); //2。創建查詢語句這里的Student為持久化類的,類名 String hql="from Student"; //String hql="from Student where sid=201503011 "; //3.創建Query對象 Query query=session.createQuery(hql); //4.執行查詢 返回結果為Iterator Iterator<Student> iterator=query.iterate(); //5.輸出結果 while(iterator.hasNext()){ Student stu=iterator.next(); System.out.println(stu.getSname()+stu.getSex()); } 5.3、uniqueResult()方法返回的結果為一個對象,一般用來根據主鍵查詢
//1.得到session Session session=HibernateSessionFactory.getSession(); //2。創建查詢語句這里的Student為持久化類的,類名 //String hql="from Student"; String hql="from Student where sid=201503011 "; //3.創建Query對象 Query query=session.createQuery(hql); //4.執行查詢 返回結果為Object類型, Student student=(Student) query.uniqueResult(); //5.輸出結果 System.out.println(student.getSname()+student.getSex());5.4、list()和iterate()方法區別
兩都的查詢機制不同
使用list()時,只需要查詢一次就可以完成全部持久化類的,全部字段的查詢
使用iterate()時,第一次查詢出來的是全部記錄的主鍵ID,然后再去系統緩存中查詢相應的記錄,如果有這個ID的記錄, 將不進行數據庫查詢,如果沒有將進行數據庫查詢,有多少條記錄就要查詢1+N次。
六、屬性查詢(投影查詢)6.1、直接指定屬性查詢返回結果為Object數組,數組的長度為屬性的個數
public static void findByproperty(){ //1.得到session Session session=HibernateSessionFactory.getSession(); //2。創建查詢語句這里的Student為持久化類的,類名 //String hql="from Student"; String hql="select sid,sname,sex from Student "; //3.創建Query對象 Query query=session.createQuery(hql); //4.執行查詢 返回結果為Object類型, List list=query.list(); //5.輸出結果 for (Object object : list) { //結果為查詢屬性數據 的Object對象數組 Object [] obj=(Object[]) object; System.out.println(obj[0]+"/t"+obj[1]+"/t"+obj[2]); } }6.2、使用構造方法查詢前提是持久化類中要有這個構造方法
返回結果為持久化類的對象集合
public static void findByCons(){ //1.得到session Session session=HibernateSessionFactory.getSession(); //2。創建查詢語句這里的Student為持久化類的,類名 //String hql="from Student"; String hql="select new Student(sid,sname,sex) from Student "; //3.創建Query對象 Query query=session.createQuery(hql); //4.執行查詢 返回結果為Object類型, List<Student> list=query.list(); //5.輸出結果 for (Student stu : list) { System.out.println(stu.getSname()+"/t"+stu.getSex()); } }這種更直接,明了解,一定要有相應的構造方法
七、實體更新和刪除7.1、更新
Session session =new Configuration().configure().buildSessionFactory().openSession(); Student stu=(Student) session.get(Student.class, 201509009); Course cou=(Course) session.get(Course.class, 2222); Transaction tran=session.beginTransaction(); stu.getCourses().add(cou); session.update(stu); tran.commit(); session.close();View Code7.2、刪除

Session session =new Configuration().configure().buildSessionFactory().openSession(); Student stu=(Student) session.get(Student.class, 201509009); Course cou=(Course) session.get(Course.class, 2222); Transaction tran=session.beginTransaction(); stu.getCourses().remove(cou); session.update(stu); tran.commit(); session.close();View Code八、參數綁定8.1占位符、
和JDBC中一樣使用?來占位





public static void findCount(){ Session session=new Configuration().configure().buildSessionFactory().openSession(); /*String hql="from Emp"; Query query=session.createQuery(hql); List list=query.list(); int count=list.size();*/ String hql="select count(*) from Emp"; Query query=session.createQuery(hql); Long count=(Long) query.uniqueResult(); System.out.println("員工表總記錄數:"+count); } View Code新聞熱點
疑難解答