程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 在Java的Hibernate框架中應用SQL語句的簡略引見

在Java的Hibernate框架中應用SQL語句的簡略引見

編輯:關於JAVA

在Java的Hibernate框架中應用SQL語句的簡略引見。本站提示廣大學習愛好者:(在Java的Hibernate框架中應用SQL語句的簡略引見)文章只能為提供參考,不一定能成為您想要的結果。以下是在Java的Hibernate框架中應用SQL語句的簡略引見正文


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指定了字段的別號,法式中照樣一樣:


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(?,?) 

  它挪用了我們設置裝備擺設的sql-insert標簽內的語句
我們再來看一下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語句也是異樣的設置裝備擺設。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved