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();