Hibernate查詢方式,hibernate查詢
使用HQL查詢資料
Hibernate提供的查詢方式:
1、OID查詢方式
通過session提供的get()和load()方法載入指定的OID對象,只能按照對象的id進行查詢。
2、HQL查詢方式
通過Query介面使用HQL語言進行查詢。
3、QBC查詢方式
通過Criteria等介面和類進行查詢
4、本地SQL查詢方式
使用原生SQL語言進行查詢,查詢結果不是結果集,而是持久化類對象。
5、對象導航查詢方式
通過已經載入的對象,導航到其關聯對象。
HQL是Hibernate提供的物件導向的查詢語言,HQL和SQL的文法格式相似,HQL操作持久化類,而不是資料庫表。
使用HQL查詢步驟:
1、得到session對象。
Session session =HibernateUtil.getSessionFactory().openSession();
2、編寫HQL語句。
String hql ="from Student where sname='Tom'";
3、建立Query對象。
Query query = session.createQuery(hql);
4、執行查詢,得到結果。
List<Student>list = query.list();
注意:HQL操作的是持久化類,因此上述第二步中Student指的是持久化類Student,sname指的是持久化類屬性sname,而不是資料庫表的欄位sname。
Query介面,是HQL查詢介面,提供了各種的查詢功能,相當於JDBC的Statement和PreparedStatement。可以通過session的createQuery()建立其對象。
實體查詢
就是要查詢持久化類的完整資訊,要查詢它的全部屬性
例如:
from Student或者from com.po.Student通常不需要使用類的全限定名預設時自動引入。from Student s或from Student as s,這是為類名取別名,其中as是可選的。where子句。from Student where sid=11070130或者fromStudent s where s.sid=11070130
where子句中可以使用各種運算子
例如:
from Student where sex=’男’ and sid<11070200from Student where sid between 11070100 and 11070200from Student where sname like ‘%飛’ %匹配任意長度字元from Student where sname like ‘_ik%’ “_”匹配單個字元,注意底線不能進行漢字匹配。
返回查詢結果可以使用Query的三個方法來實現:list(),iterate(),uniqueResult();
使用list()方法,返回查詢持久化類的一個集合,而iterate()方法,直接返回持久化類的一個跌的器。
兩者的區別在於:
1、查詢機制不同
使用list(),查詢一次即可,從資料庫中檢索出所有合格記錄,包含全部欄位。
使用iterate(),首先從資料庫中檢索出所有合格記錄,僅包含id欄位。然後去緩衝查看緩衝中是否存在這些學生資訊。
a)如果緩衝中包含全部資料,無需再查尋資料庫,直接引用。查詢1次,此時iterate()效率明顯高於list()。
b)如果 緩衝中不包含任何資料,需在查詢資料庫n次(n代表符合查詢條件的記錄數),依次查詢各條記錄,需要查詢(n+1)次,此時iterate()的效率要大大的低於list()。
大多數情況下使用list()進行查詢,當對象包含大量屬性,或者要載入的大部分資料已經存在緩衝中,可以使用iterate()。
屬性查詢(投影查詢)
只查詢持久化類的部分屬性而不是全部屬性
屬性查詢方式:
1、通過直接指定屬性進行屬性查詢。例如:查詢學生的學生編號和學生姓名。
String hql = “select sid,sname from Student”;Query query = session.createQuery(hql);List list = query.list();Iterator it = list.iterator();while(it.hasNext()){ Object obj[]= (Object[])it.next; System.out.println(obj[0]+” ”+obj[1]);}
注意:這種查詢方式List集合中的每個元素不是學生類型,而是一個對象數組,數組的長度取決於查詢的屬性的個數,上述樣本中對象數組的長度為2,第一個元素存放學生id,第二個元素存放學生的姓名。
2、通過構造方法進行屬性查詢。例如:查詢學生的學生編號和學生姓名。
首先為相應的持久化類提供響應的構造方法。
String hql = “select new Student(sid,sname) from Student”;Query query = session.createQuery(hql);List list = query.list();Iterator it = list.iterator();while(it.hasNext()){ Student stu =(Student)it.next(); System.out.println(stu.getSid()+””+stu.getSname());}
實體更新和刪除
例如:將編號為11070130學生的姓名更改為趙飛
String hql = “update Student set sname=’趙飛’ where sid=11070130”;Query query = session.createQuery(hql);int n = query.executeUpdate(); //n代表更新記錄的個數
例如:刪除學生編號為11070130的學生資訊
String hql = “delete from Student where sid=11070130”;Query query = session.createQuery(hql);int n = query.executeUpdate();
參數綁定
使用字串拼接缺點:效能低、安全性差、容易拼接錯誤。
參數綁定1:“?”預留位置
String name=”趙飛”; String hql=”fromStudent where sname=?”; Query query =session.createQuery(hql); query.setString(0,name);//填充的內容是什麼類型的用setXXX進行填充 List<Student>list = query.list();
參數綁定2:具名引數
String name=”趙飛”; String hql = “fromStudent where sname=:sname”; Query query =session.createQuery(hql); query.setString(“sname”,name); List<Student> list = query.list();
HQL排序功能:
HQL通過order by子句實現對查詢結果的排序。預設升序排序。
例如:
String hql = “from Student order bysname”;
也可以指定排序策略,(asc升序、desc降序)
例如:
String hql = “from Student order bysname desc”;
order by子句可以指定多個排序條件,
例如:
String hql = “from student order bysname,sid desc”;
首先按照學生姓名進行升序排序,對於學生姓名相同的對象將按照學生編號進行降序排列。
統計函數的使用
共有5個統計函數為:avg(),sum(),min(),max(),count(),分別用來求平均數,求和,求最小值,求最大值,計數的功能。
與SQL中的統計函數不同的是:SQL中的統計韓式是用來對資料庫表的欄位進行操作,而HQL中的統計函數則是對持久化類的屬性進行操作。
樣本1:統計學生數目
String hql=”select count(*) from Student”;Long n =(Long)session.createQuery(hql).uniqueResult();
樣本2:查詢所有學生的平均分、最低分、最高分。
String hql = “select avg(score),min(score),max(score)from Student”;Object obj[] =(Object[])session.createQuery(hql).uniqueResult();
分組查詢
樣本:統計各個班級的學生人數
select gid,count(*) from Student group by gid;
having子句用於用於對分組結果添加查詢條件。
樣本:統計人數大於20的班級的學生人數
select gid,count(*) from Student group by gid having count(*)>20
分頁查詢
使用Hibernate Query介面提供的方法。
1、setFirstResult()設定第一條記錄的位置。
2、setMaxResult()設定最大返回的記錄條數。
分頁實現:
1、根據結果獲得總記錄數
Query query =session.createQuery(“from Student”); List<Student>list = query.list(); int count =list.size();
2、計算總的頁數
inttotalpages = (count%pageSize==0)?(count/pageSize):(count/pageSize+1);
3、實現分頁
query.setFirstResult((pageIndex-1)*pageSize); query.setMaxResults(pageSize); List result =query.list();
子查詢
樣本:查詢成績高於張華和趙飛成績的學生資訊
from Student where score >all(select score fromStudent where sname=’張華’ or sname=’趙飛’);
all的含義是分數要高於括弧內所有的分數,如果題目要求查詢高於張華或趙飛的成績,應該使用any關鍵字。
串連查詢
使用join子句實現多個持久化對象之間的聯集查詢。一般是針對連個持久化對象進行查詢。
查詢分類
樣本,用到的資料庫表為班級表和學生表,表情況如下:
內串連文法:
from Entity inner join Entity.property
Entity指明了一個持久化類,Entity.propery是指明了第一個持久化類中與第二個持久化類建立關聯的屬性
例如:查詢班級和學生中的所有匹配資料。
from Grade g inner join g.students等價於以下兩個語句:from Grade g,Student s whereg=s.grade
from Grade g,Student s where g.gid=s.grade.gid;
左外串連文法
from Entity left outer join Entity.property
例如,顯示班級和學生中的匹配資訊,並且顯示沒有學生的班級
from Grade g left join g.students;
右外串連文法:
from Entity right outer join Entity.property
例如,顯示班級和學生中的匹配資訊,並且顯示沒有班級的學生資訊
from Grade g right join g.students;或者
from Student s left join s.grade;
hibernate怎使用查詢
1:hibernate資料查詢方式:有HQL方式,QBC方式,原生SQL方式。HQL適合靜態查詢,QBC則適合較多的動態查詢。
A:HQL方式,支援條件查詢,串連查詢,分頁查詢,分組查詢,內建函數和自訂函數查詢(SUN(),MIN(),MAX()),子查詢,動態綁定參數查。
HQL語句定義如下:
String hql="from book";
Query query=session.createQuery(hql);
B:QBC方式,也就是QBC檢索方式。QBC通過Session類建立Criteria執行個體,通過不同方法進行檢索,實際上Criteria是用來裝載查詢條件的容器。QBC有很多條件函數,如:Resstictions.eq(),Resstictions.gt(),Resstictions.ge(),
Resstictions.le(),Resstictions.and(),Resstictions.or()等。
Criteria容器使用方法如下:
Criteria criteria=session.createCriteria(book.class);
criteria.add(Restrications.It("id",new Integer(4)));
List list=criteria.list();
C:原生SQL方式。不管是HQL還是QBC最終都要通過Hibernate來解析,把他們轉換成SQL語句進行對資料庫的操作。因為我們知道SQL可以在多平台之間使用。
使用原生SQL方式如下:
String sql="select {b.*} from book b"
SQLQuery squery=session.createSQLQuery(sql);
squery.addEntity("b",book.class);
List list=squery.list();
2:hibernate的關聯查詢
A:一對一關聯:
B:一對多,多對一關聯
C:多對多關聯
最後,要學hibernate,平時要多動手,慢慢積累經驗,成就感就會也大,這樣才能學而不厭。祝你學習進步。
Hibernate的幾種查詢方式
HQL 通過Hibernate提供的查詢語言進行查詢。Hibernate Query lanagueEJBQL(JPQL 1.0) 是EJB提供的查詢語言QBC(query by cretira)通過Cretira介面進行查詢QBE(query by Example) 通過Example編程介面進行查詢從功能強弱上排序:NativeSQL > HQL > EJBQL(JPQL 1.0) >QBC(query by cretira) >QBE(query by Example) 1: QBE (Query By Example) QBC查詢方式QBC(Query By Criteria)查詢方式是 Hibernate 提供的“ 更加物件導向”的一種檢索方式。 QBC 在條件查詢上比 HQL 查詢更為靈活,而且支援運行時動態天生查詢語句。在Hibernate 應用中使用 QBC 查詢通常經過 3 個步驟(1)使用 Session 執行個體的 createCriteria() 方法建立 Criteria 對象(2)使用工具類 Restrictions 的相關方法為 Criteria 對象設定查詢對象(3)使用 Criteria 對象的 list() 方法執行查詢,返回查詢結果QBE查詢QBE查詢就是檢索與指定樣本對象具有相同屬性值的對象。因此QBE 查詢的關鍵就是樣本對象的建立,樣本對象中的所有非空屬性均將作為查詢條件。 QBE 查詢的功能子集,固然 QBE 沒有 QBC 功能大,但是有些場合 QBE 使用起來更為方便。 工具類Example 為 Criteria 對象指定樣本對象作為查詢條件Java代碼1 Session session = HibernateSessionFactory.getSessionFactory().openSe ssion();2 Transaction ts = session.beginTransaction();3 Customer c = new Customer();4 c.setCname("Hibernate");5 Criteria criteria = session.createCriteria(Customer. class );6 Criteria.add(Example.create(c));7 Iterator it = criteria.list().iterator();8 ts.commit();9 HibernateSessionFactory.closeSession();