Hibernate使用原生SQL適應複雜數據查詢

HQL儘管容易使用,可是在一些複雜的數據操做上功能有限。特別是在實現複雜的報表統計與計算,以及多表鏈接查詢上每每無能爲力,這時可使用SQL(Native SQL)實現HQL沒法完成的任務。 java

一、使用SQL詢  sql

使用SQL查詢能夠經過兩種方式來實現: 
(1)、利用Hibernate提供的SQLQuery對象執行。便可以經過Session對象的createSQLQuery()方法獲取。如:
String sql = "select * from product limit 0,10"; 

SQLQuery query = session.createSQLQuery(sql); 

List<Object[]> = query.list();
 注意:查詢結果返回的是一個Object的數組。 
(2)、利用ResultMetaData對象來實現執行SQL語句,可是若是過多地使用這種方法就會對系統的性能產生影響,它將下降運行效率。經過addScalar()方法設置返回數據的類型能夠減小ResultSetMetaData對象的使用而提升運行效率。如:
String sql = "select * from product limit 0,10"; 

SQLQuery sqlQuery = session.CreateSQLQuery(); 

sqlQuery.addScalar("id",Hibernate.INTEGER); 

sqlQuery.addScalar("name",Hibernate.STRING); 

sqlQuery.addScalar("addre",Hibernate.STRING); 

sqlQuery.addScalar("des",Hibernate.STRING); 

List<Object[]> list = sqlQuery.list();
二、返回SQL查詢的持久對象
 獲取SQL查詢的持久對象有三種方式實現: 
方式1:Hibernate不只能把查詢到的記錄封裝爲包含多個Object數組的List對象返回,還能夠把每一條查詢到的記錄封裝成持久對象後返回包含這些對象的List對象。如:
String sql = "select * from product limit 0,10"; 

SQLQuery sqlQuery = session.CreateSQLQuery(); 

sqlQuery.addEntity(Product .class); 

List<Product> list = sqlQuery.list();
方式2:使用大括號指定查詢的字段,而後經過SQLQuery對象對象的addEntity()方法關聯SQL中的別名和持久化類肯定要返回的List對象中的每一個元素類型。如:  
String sql = "select{p.*} from Product p,Category c where p.category_id=c.id"; 

SQLQuery sqlQuery = session.CreateSQLQuery(); 

sqlQuery.addEntity("p",Product.class); 

List<Product> list = sqlQuery.list();
方式3:同時使用SQLQuery對象的addScalar()方法和Transformers對象的aliasToBean()方法關聯數據庫的表與持久化類肯定返回記錄的各個字段與持久化類屬性的對象對應關係。如: 
String sql = "select p.id,p.name from product p,Category c where p.category_id = c.id"; 

SQLQuery sqlQuery = session.createSQLQuery(sql); 

sqlQuery.addScalar("id",Hibernate.INTEGER) 
.addScalar("name",Hibernate.STRING); 

sqlQuery.setResultTransformer(Transformers.aliasToBean(Product.class)); 

List<Product> list = sqlQuery.list();
相關文章
相關標籤/搜索