HQL儘管容易使用,可是在一些複雜的數據操做上功能有限。特別是在實現複雜的報表統計與計算,以及多表鏈接查詢上每每無能爲力,這時可使用SQL(Native SQL)實現HQL沒法完成的任務。 java
一、使用SQL查詢 sql
使用SQL查詢能夠經過兩種方式來實現:String sql = "select * from product limit 0,10"; SQLQuery query = session.createSQLQuery(sql); List<Object[]> = query.list();注意:查詢結果返回的是一個Object的數組。
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查詢的持久對象
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();