HQL是Hiberante官方推薦的Hibernate檢索方式,,它使用類似SQL的查詢語言,以面向對象的方式從數據庫中查詢,??梢允褂肏QL查詢具有繼承、多態(tài)和關聯關系的數據,。在檢索數據時應優(yōu)先考慮使用HQL方式,。
本筆記將會沿用前面所使用的dept部門表,,emp員工表。
dept部門表
emp員工表
1 查詢實體
hibernate的session.createQuery()方法是使用HQL語句查詢對象的,。
hql:是查詢對象的,,例如:"from User",其中from不區(qū)分大小寫,,而User是區(qū)分大小寫,,因為它是對象。是User類
返回Query對象,。
執(zhí)行這條語句后,,Hibernate會根據配置文件中所配置的數據庫適配器自動生成相應數據庫的SQL語句。
sql: select * from dept; from 后面是表名
hql: form Dept; from 后面是類,。
可以對類起別名,,有兩種方法。
hql: from Dept d
hql:from Dept as d
以上兩種起別名方法皆可,。
public void Test1() throws Exception{ Configuration config=new Configuration().configure(); SessionFactory sessionFactory= config.buildSessionFactory(); Session session=null; Transaction tr=null; try{ session= sessionFactory.openSession(); tr=session.beginTransaction(); String hql="from Dept"; //定義String類型hql,,寫入hql語句。 Query query=session.createQuery(hql);
List<Dept> list = query.list(); for(Dept dept:list){ System.out.print("部門編號: "+dept.getDid() +" "); System.out.println("部門名稱: "+dept.getDname());
} tr.commit(); }catch(Exception e){ tr.rollback(); }finally{ if(session!=null){ session.close(); } if(sessionFactory!=null){ sessionFactory.close(); } } }
執(zhí)行結果
Hibernate: select dept0_.did as did1_, dept0_.dname as dname1_, dept0_.daddress as daddress1_ from dept dept0_ 部門編號: 1 部門名稱: 業(yè)務部 部門編號: 2 部門名稱: 技術部 部門編號: 3 部門名稱: 管理部 部門編號: 4 部門名稱: 財務部 部門編號: 5 部門名稱: 人力資源部
2 查詢表中單個屬性
sql: select ename from dept
hql: select ename from Dept
對屬性也可以設置別名
hql:select ename as from Dept
as 必須加,。
public void Test2() throws Exception{ Configuration config=new Configuration().configure(); SessionFactory sessionFactory= config.buildSessionFactory(); Session session=null; Transaction tr=null; try{ session= sessionFactory.openSession(); tr=session.beginTransaction(); Query query=session.createQuery("select dname from Dept"); List<String> list = query.list(); for(String name:list){ System.out.println("部門名稱: "+name); } tr.commit(); }catch(Exception e){ tr.rollback(); }finally{ if(session!=null){ session.close(); } if(sessionFactory!=null){ sessionFactory.close(); } } }
執(zhí)行結果:
Hibernate: select dept0_.dname as col_0_0_ from dept dept0_ 部門名稱: 業(yè)務部 部門名稱: 技術部 部門名稱: 管理部 部門名稱: 財務部 部門名稱: 人力資源部
3 對多個屬性進行查詢
sql: select ename,eage from emp
hql:select ename,eage from Emp
hql: select e.ename,e.eage from Emp e
以上兩種hql寫法均可,。
public void Test3() throws Exception{ Configuration config=new Configuration().configure(); SessionFactory sessionFactory= config.buildSessionFactory(); Session session=null; Transaction tr=null; try{ session= sessionFactory.openSession(); tr=session.beginTransaction(); Query query=session.createQuery("select ename,eage from Emp"); List<Object[]> list = query.list(); //對多個屬性查詢的時候,使用Obejct數組,。
for(Object[] message:list){ System.out.println(Arrays.toString(message)); //采用輔助類Arrays的toString()方法打印數組,。 } tr.commit(); }catch(Exception e){ tr.rollback(); }finally{ if(session!=null){ session.close(); } if(sessionFactory!=null){ sessionFactory.close(); } } }
測試結果
Hibernate: select emp0_.ename as col_0_0_, emp0_.eage as col_1_0_ from emp emp0_ [劉德華, 40] [李世民, 34] [曹操, 59] [和珅, 44] [賀龍, 45] [郭富城, 34]
4 通過實體類方式查詢多屬性
除了上述方法外,還可以采用實體類的方式查詢,,要在Emp類中加入帶有查詢參數的構造器,,代碼如下。
public class Emp { private int eid;
private int eage;
private float esal; private String ename;
省略get,,set方法,。
public Emp() { super(); } public Emp(int eage, String ename) { //需要查詢的屬性是什么,構造器的參數就是什么,。 super(); this.eage = eage; this.ename = ename; }
測試類
public void Test4() throws Exception{ Configuration config=new Configuration().configure(); SessionFactory sessionFactory= config.buildSessionFactory(); Session session=null; Transaction tr=null; try{ session= sessionFactory.openSession(); tr=session.beginTransaction(); Query query=session.createQuery("select new Emp(eage,ename) from Emp e"); select 后直接調用構造器,,參數就是查詢的屬性,參數不可錯亂,。 List<Emp> list = query.list(); 此處不實用object數組,,類類型即可 for(Emp message:list){ System.out.print("姓名:"+message.getEname()+" "); System.out.println("年齡:"+message.getEage()); } tr.commit(); }catch(Exception e){ tr.rollback(); }finally{ if(session!=null){ session.close(); } if(sessionFactory!=null){ sessionFactory.close(); } } }
測試結果
Hibernate: select emp0_.eage as col_0_0_, emp0_.ename as col_1_0_ from emp emp0_ 姓名:劉德華 年齡:40 姓名:李世民 年齡:34 姓名:曹操 年齡:59 姓名:和珅 年齡:44 姓名:賀龍 年齡:45 姓名:郭富城 年齡:34
|