天天看點

Hibernate日常應用的相關問題

預設情況下,hibernate的sql中都是以問号代表參數,并沒有顯示參數的真實值,但是也不是做不到,隻需要兩步配置就可以顯示出參數的真實值了:

(1)spring的配置檔案中增加: 

<prop key="hibernate.show_sql">true</prop> 

或者在hibernate的配置檔案中增加: 

<property name="show_sql">true</property>

(2)在log4j.properties中做如下配置: 

log4j.appender.stdout.threshold=trace 

log4j.category.org.hibernate.sql=trace 

log4j.category.org.hibernate.type=trace

在方法開始前spring通過動态代理,利用aop的方式,為普通要調用的方法在方法開始處添加事務控制,如果在方法中要進行save操作,則進行getsession。

在調用getsession()方法時,拿到資料庫連接配接,如果在一個循環中多次調用save方法,因為spring會控制在一個事務中隻有同一個session,

是以跟資料庫的連接配接也隻有一次,是以如果循環儲存一個list,在service層循環和在dao層循環都是一樣的(spring事務是加在service層的情況)。

delete()方法用于從資料庫中删除與java對象對應的記錄。如果傳入的參數是持久化對象,session就計劃執行一個delete語句。

如果傳入的參數是遊離對象,先使遊離對象被session關聯,使它變為持久化對象,然後計劃執行一個delete語句。

值得注意的是,session隻有在清理緩存的時候的才執行delete語句。

此外,隻有當調用session的close()方法時,才會從session的緩存中删除該對象。

例如以下代碼先加載一個持久化對象,然後通過delete()方法将它删除:

1

2

3

4

5

6

7

<code>session session1 = sessionfactory.opensession();</code>

<code>transaction tx1 = session1.begintransaction();</code>

<code>// 先加載一個持久化對象</code>

<code>customer customer = (customer)session.get(customer.</code><code>class</code><code>, </code><code>new</code> <code>long(</code><code>1</code><code>));</code>

<code>session.delete(customer); </code><code>// 計劃執行一個delete語句</code>

<code>txt1.commit(); </code><code>// 清理緩存,執行delete語句</code>

<code>session.close();子</code><code>// 從緩存中删除customer對象</code>

以下代碼直接通過delete()方法删除一個遊離對象:

<code>session session2 = sessionfactory.opensession();</code>

<code>transaction tx2 = session1.begintransaction();</code>

<code>// 假定customer是一個遊離對象,先使它被session關聯,使它變為持久化對象,</code>

<code>// 然後計劃執行一個delete語句</code>

<code>session2.delete(customer);</code>

<code>tx2.commit(); </code><code>// 清理緩存,執行delete語句</code>

<code>session2.close(); </code><code>// 從緩存中删除customer對象 </code>

如果希望删除多個對象,可以使用另一種重載形式的delete()方法:

<code>session.delete(</code><code>"from customer as c where c.id&gt;8"</code><code>);</code>

以上delete()方法的參數為hql查詢語句,delete()方法将從資料庫中删除所有滿足查詢條件的記錄。

1.     使用hql語句

query q = session.createquery("select e from com.sun.demo.emp e");

2.     使用load方法(主鍵查詢)

emp e = (emp)session.load(emp.class, 1141);

3.     使用get方法(主鍵查詢)

emp e = (emp)session.get(emp.class, 1141);

4.     參數化查詢(使用?通配符,或者指令通配符)

8

<code>query q = session.createquery(</code><code>"update userinfo set ename='aaa' where ename=?"</code><code>);</code>

<code>       </code><code>q.setparameter(</code><code>0</code><code>, </code><code>"smith"</code><code>);</code>

<code>query q = session.createquery(</code><code>"update userinfo set ename='aaa' where ename like ?"</code><code>);</code>

<code>       </code><code>q.setparameter(</code><code>0</code><code>, </code><code>"%m%"</code><code>);</code>

<code>query q = session.createquery(</code><code>"update userinfo set ename='aaa' where ename like :lkename"</code><code>);</code>

<code>       </code><code>q.setparameter(</code><code>"lkename"</code><code>, </code><code>"%l%"</code><code>);</code>

  

5.     命名查詢

<code>&lt;</code><code>query</code> <code>name="myquery"&gt;</code>

<code> </code><code>&lt;![cdata[ from com.sun.hibernate.employer where job = ?]]&gt;</code>

<code>&lt;/</code><code>query</code><code>&gt;</code>

<code>query q = session.getnamedquery(</code><code>"myquery"</code><code>);</code>

<code>q.setparameter(</code><code>0</code><code>, </code><code>"manager"</code><code>);</code>

6.     屬性查詢

query q = session.createquery("select max(sal) from employer e where sal is not null");

query q = session.createquery("select distinct job from employer e");

7.     執行個體化查詢

步驟如下:

1.編寫你的hql語句

2.建立普通的java類 -------------------與pojo類不同,它與資料庫沒有任何關系

3.在該java類中你需要建立和查詢結果對應的字段

4.在該java類中,你需要建立合适的構造函數

5.完善你的hql語句,使用執行個體化查詢的方式進行包裝

6.通過list.get(i)擷取的結果就不再是一個數組,而是一個包裝後的對象

例子:

<code>query q = session.createquery(</code><code>"select new com.sun.demo.userdate(ename,sysdate) from userinfo"</code><code>);</code>

<code>list list = q.list();</code>

<code>for</code><code>(</code><code>int</code> <code>i=</code><code>0</code><code>;i&lt;list.size();i++){</code>

<code>       </code><code>userdate u = (userdate)list.get(i);</code>

<code>       </code><code>system.out.println(u.getename());</code>

<code>}</code>

8.     多态查詢

對于pojo來說,java中的這種關系被擴充到了資料庫表中

hibernate在查詢一個表的同時,會檢查該表所對應的pojo類有沒有子類,如果有,一起查詢出來

9.     分頁查詢

//查詢第三到五條

              q.setfirstresult(3);//從第三條開始

              q.setmaxresults(3);//提取三條

10.  uniqueresult方法查詢(查詢結果隻能是一個字段)

query q = session.createquery("select count(*) from employer");

long count = (long)q.uniqueresult();

11.  criteria查詢(通過面向對象化的設計,将資料查詢條件封裝為一個對象)

9

10

11

12

13

14

15

16

17

<code>criteria c = session.createcriteria(employer.</code><code>class</code><code>);</code>

<code>       </code><code>c.addorder(order.asc(</code><code>"sal"</code><code>));      </code><code>//按薪水升序查詢</code>

<code>       </code><code>c.setfirstresult(</code><code>3</code><code>);</code>

<code>       </code><code>c.setmaxresults(</code><code>3</code><code>);</code>

<code>       </code><code>list list = c.list();</code>

<code>       </code><code>for</code><code>(</code><code>int</code> <code>i=</code><code>0</code><code>;i&lt;list.size();i++){</code>

<code>           </code><code>employer emp = (employer)list.get(i);</code>

<code>           </code><code>system.out.println(emp.getename() + </code><code>" : "</code> <code>+ emp.getsal());</code>

<code>       </code><code>}</code>