在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 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-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=?我們看到輸入的語句是年夜寫的,也就是挪用了我們設置裝備擺設的語句。