Hibernate(五)__hql語句

來源:互聯網
上載者:User

標籤:color   檢索   思路   lang   stat   having   save   tween   簡單   

hql(hibernate query language)功能強大。

首先回憶下之前我們接觸的對資料對象的操作:

①刪除session.delete(對象) 

②儲存session.save(對象)  session.persist(對象)

③修改obj.setXXX();

   session.update(對象)

④查詢session.load(***.class, 1) ; session.get(***.class, 1);

可是這樣只能進行簡單的資料操作,想要做較為複雜的操作,就要用到hql語句了。

hql的詳解

hibernate 設計者 推薦我們在設計表的時候,應當每張表有一個主鍵,而且該主鍵最好不含商務邏輯(不要有實際意義)

如:product 表

id   productNo   name      price

1   bi001       冰箱       1000

2   nj111       電腦       2000 

最好不要將產品編號設計成主鍵,產品編號假如變化那麼整個資料表就會變化,傷筋動骨,但是如果設計另外一個主鍵id不含商務資訊

變編號名字價格資料都是穩定的。 

我們使用hibernate工具,自動產生 domain 對象和對應檔,如果我們的表有主外鍵的關係,則應當先映射主表,再映射從表。

我們建立三張表:學生、學生所選課程、課程。

表的關係和對應檔的關係如下(到後面我們專門學到一對多、多對一、多對多等對應關係):

*檢索一個表中的所有資料對象

List<Student> list= session.createQuery("from Student ").list;

* uniqueResult方法

如果我們檢索一個對象,明確知道最多隻有一個對象,則建議使用該方法,效率更高:

具體用法如下:

Student s=(Student) session.createQuery("from Student where sid=‘20050003‘").uniqueResult();

System.out.println(s.getSname());

*distinct的用法

過濾重複的記錄

//比如,顯示所有學生的性別和年齡.

List list=session.createQuery("select distinct sage,ssex from Student").list();

for(int i=0;i<list.size();i++){

Object []  objs=(Object[]) list.get(i);

System.out.println(objs[0].toString()+" "+objs[1].toString());

}

*between and..

List list=session.createQuery("select distinct sage,ssex,sname from Student where sage between 20 and 22").list();

for(int i=0;i<list.size();i++){

Object []  objs=(Object[]) list.get(i);

System.out.println(objs[0].toString()+" "+objs[1].toString()+objs[2].toString());

}

*in /not in

//查詢電腦系和外語系的學生資訊

List<Student> list=session.createQuery("from Student where sdept in (‘電腦系‘,‘外語系‘)").list();

//取出for 增強

for(Student s:list){

System.out.println(s.getSname()+" "+s.getSaddress()+" "+s.getSdept());

}

*group by使用

//顯示各個系的學生的平均年齡

List<Object[]> list=session.createQuery("select avg(sage),sdept from Student group by sdept").list();

//取出for 增強

for(Object[] obj:list){

System.out.println(obj[0].toString()+" "+obj[1].toString());

}

*having

1.對分組查詢後的結果,進行篩選:比如請顯示人數大於3的系名稱

List<Object[]> list=session.createQuery("select count(*) as c1,sdept from  Student group by sdept having count(*)>3").list();

//取出for 增強

for(Object[] obj:list){

System.out.println(obj[0].toString()+" "+obj[1].toString());

}

//查詢各個系的女生有多個個

List<Object[]> list=session.

createQuery("select count(*) as c1,sdept from Student where ssex=‘F‘ group by sdept").list();

//取出for 增強

for(Object[] obj:list){

System.out.println(obj[0].toString()+" "+obj[1].toString());

}

2.查詢電腦系共多少人?->如果我們返回的是一列資料

//這時我們的取法是直接取出list->object 而不是 list->Object[]

List<Object[]> list=session.

createQuery("select sage from  Student where sdept=‘電腦系‘").list();

//取出for 增強

for(Object obj:list){

System.out.println(obj.toString());

}

3.查詢選修11號課程的最高分和最低分.

List<Object[]> list=session.

createQuery("select 11,max(grade),min(grade) from Studcourse where course.cid=11").list();

//取出for 增強

for(Object[] obj:list){

System.out.println(obj[0].toString()+" max="+obj[1].toString()+" min="+obj[2].toString());

}

4.計算各個科目不及格的學生數量.

List<Object[]> list=session.

createQuery("select count(*),student.sdept from Studcourse where grade<60 group by student.sdept").list();

//取出1. for 增強

for(Object[] obj:list){

System.out.println(obj[0].toString()+" "+obj[1].toString());

}

 

參數綁定案例 (jdbc->PreparedStatement setXXX)

使用參數綁定的好處有3:  

  1. 可讀性提高, 2 效果高 3,防止 sql注入漏洞

面試題: 如果不使用參數綁定,怎樣防止登入時, sql注入?

name  password  

思路: 通過使用者名稱,查詢出該使用者名稱在資料庫中對應的密碼,然後再與使用者輸入的秘密比較,如果相等,則使用者和法,否則,非法.

參數綁定有兩種形式

Query q=session.createQuery(from Student where sdept=:dept and sage>:age)

如果我們的參數是 :冒號形式給出的,則我們的參數綁定應當這樣:

List<Student> list=session.createQuery("from Student where sdept=:a1 and sage>:sage")

.setString("a1", "電腦系").setString("sage", "2").list();

還有一種形式:

Query q=session.createQuery(from Student where sdept=? and sage>?)

如果我們的參數是以 ? 形式給出的則,參數綁定應當:

List<Student> list=session.createQuery("from Student where sdept=? and sage>?")

.setString(0, "電腦系").setString(1, "2").list();

參數的綁定,可以分開寫:形式如下:

Query query=session.createQuery("from Student where sdept=? and sage>?");

query.setString(0, "電腦系");

query.setString(1, "2");

List <Student> list=query.list();

for(int i=0;i<list.size();i++){

Student s= list.get(i);

System.out.println(s.getSname()+" "+s.getSage());

}

Hibernate(五)__hql語句

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

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.