HQL尽管容易使用,但是在一些复杂的数据操作上功能有限。特别是在实现复杂的报表统计与计算,以及多表连接查询上往往无能为力,这时可以使用SQL(Native SQL)实现HQL无法完成的任务。
1、使用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的数组。
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();
String sql = "select * from product limit 0,10"; SQLQuery sqlQuery = session.CreateSQLQuery(); sqlQuery.addEntity(Product .class); List<Product> list = sqlQuery.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();