Hibernate查詢方式,hibernate查詢

來源:互聯網
上載者:User

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();
 

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.