首頁 > Java > java教程 > 主體

在Java的Hibernate框架中使用SQL語句的簡單介紹

高洛峰
發布: 2017-01-23 11:32:54
原創
1155 人瀏覽過

Hibernate中有HQL查詢語法。但我們用得比較熟的還是數SQL語句,那該怎麼讓Hibernate支援SQL呢?這個不用我們去考慮了,Hibernate團隊已經早就做好了。
       廢話不說,直接來例子啦。

select * from t_user usr
登入後複製
登入後複製

  上面是一條SQL語句,又是廢話,是個人都知道。我們想讓Hibernate執行這條語句,該怎麼辦呢?看程式碼:

Query query = session.createSQLQuery("select * from t_user usr");
登入後複製

  就這樣,剩下來的,大家應該都知道了,平常的查詢。
        查詢完後,回傳的是什麼東西呢?

while(iter.hasNext()){
 Object[] objs = (Object[])iter.next();
 for (int i = 0; i < objs.length; i++) {
 System.out.print(objs[i]);
 }
 System.out.println();
}
登入後複製

  返回的每個結果都是Object[]數組,
      
        這時而有人跑出來對對象為目標。對,就是面向對象,唉,沒辦法。
        我們繼續看:

select {usr.*} from t_user usr
登入後複製

  看到這裡,估計某些童鞋開始雞動啦,那個大括號什麼東西啦?
    別急,慢慢來。我們先繼續看代碼。

Query query = session.createSQLQuery("select {usr.*} from t_user usr").addEntity(TUser.class);
登入後複製

  我們看到跟前面不同的是,我們加了一個addEntity,是什麼意思呢?
    我們直接API,看到這樣一串解釋:

addEntity
SQLQuery addEntity(String tableAlias,
   Class entityType)
Declare a "root" entity
Parameters:
tableAlias - The SQL table alias
entityType - The java type of the entity to add as a root
登入後複製

       有跟沒一個樣,杯具。只能自己動手用。
       第一個參數是指表的別名,就像上面的語句,我們表的別名是usr,所以第一個參數為usr,而第二個是指查詢到的結果需要映射到哪個類,這裡由於我們在映射檔中是透過TUser映射到t_user表,所以我們這裡當然也就是TUser啦。然後一查,有SQL語句出來,查到的結果是TUser類型的。
       我們查到的結果是:

org.hibernate.tutorial.domain6.TUser@198cb3d
登入後複製

  當然,你們的肯定跟我不一樣的。不要雞動。
 
    也許我們並不需要全部進行查出,這時,我們需要的只是設定別名即可:

select u.id as {usr.id},u.name as {usr.name},u.age as {usr.age} from t_user u
登入後複製

  我們看到我們用了as指定了字段的別名,程序中還是一樣:

  我們看到我們用了as指定了字段的別名,程序中還是一樣:

Query query = session.createSQLQuery("select u.id as {usr.id},u.name as {usr.name},u.age as {usr.age} from t_user u").addEntity("usr",TUser.class);
登入後複製

  這個簡單,不多說。
 
         以前我們講到,有些團隊會規定不給在程式碼中寫SQL語句,這又需要設定檔出馬啦。

         我們可以在檔案中加入:

<sql-query name="queryTUser">
 <return alias="usr" entity-name="org.hibernate.tutorial.domain6.TUser" />
 select {usr.*} from t_user usr where name=:name
</sql-query>
登入後複製


  注意,而這裡的entity-name需要寫完整的包名,不然會被錯誤的。這裡我們有子標籤return,它指定了表的別名和類別名,這樣我們在運行時就不需要再addEntity了。

    看程式碼:

Query query = session.getNamedQuery("queryTUser");
query.setParameter("name","shun");
List list = query.list();
Iterator iter = list.iterator();
登入後複製


 
  我們直接這樣就OK了,注意,我們並沒有加addEntity了,主要還是歸功於設定檔中的設定。
    注意,如果在設定檔中配置,請務必有return子標籤指定表別名和類別名稱。這主要是避免了我們讀取語句時的重複判斷。
   
 

    上面講了這麼久,我們一直在講有別名的表,那麼如果我們的表沒有別名,但又想返回的結果封裝在對象內,我們應該怎樣呢?

select * from t_user usr
登入後複製
登入後複製


  很簡單,只要呼叫addEntity的重載方法addEntity(Class clazz)就行了,只需要提供一個類別名,而不需要表別名。
 
    當然,hibernate也支援儲存過程,只需要在設定檔中把sql-query的callable屬性設為true即表示目前呼叫的是儲存過程,由於儲存過程我接觸地不多,以後多研究一下再跟大家一起研究。
   
    我們在呼叫session.save等對應的資料運算的方法時,它會轉換成hibernate內建的SQL語句,但如果我們想自己控制SQL語句的格式呢,怎麼辦?
    Hibernate其實也想到了。

    我們直接在映射檔案中加入:

<sql-insert>
 INSERT INTO T_USER (NAME,AGE) values (?,?)
 </sql-insert>
 <sql-update>
 UPDATE USER SET USER_NAME=?,AGE=? WHERE uSER_ID=?
</sql-update>
登入後複製

  注意,這個需要添加在class標籤內,作為子標籤。我們這裡全部是大寫字母,是為了跟hibernate預設的語句分清,沒有其他意思。

    我們先來看看insert的呼叫:

User user = new User();
user.setName("shun123123");
user.setAge(23);
登入後複製


  當我們呼叫儲存時,hibernate的語句是:

Hibernate: 

INSERT INTO USER(USER_NAME,AGE) values(?,?)
登入後複製

看看update的呼叫:

User user = (User)session.get(User.class,new Long(29));
user.setName("shun123123");
user.setAge(23);
session.save(user);
登入後複製

  我們呼叫保存,它會自動呼叫更新,此時的語句是:

Hibernate: 

UPDATE USER SET USER_NAME=?,AGE=? WHERE uSER_ID=?
登入後複製

  我們看到輸出的語句是大寫的,也就是我們看到的配置的語句。

 

    delete語句也是同樣的配置。

更多在Java的Hibernate框架中使用SQL語句的簡單介紹相關文章請關注PHP中文網!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!