HQL尽管容易使用,但是在一些复杂的数据操作上功能有限。特别是在实现复杂的报表统计与计算,以及多表连接查询上往往无能为力,这时可以使用SQL(Native SQL)实现HQL无法完成的任务。
1、使用SQL查询
使用SQL查询可以通过两种方式来实现:(1)、利用Hibernate提供的SQLQuery对象执行。即可以通过Session对象的createSQLQuery()方法获取。如:
1
2
3
4
5
|
String sql =
"select * from product limit 0,10"
;
SQLQuery query = session.createSQLQuery(sql);
List<Object[]> = query.list();
|
(2)、利用ResultMetaData对象来实现执行SQL语句,但是如果过多地使用这种方法就会对系统的性能产生影响,它将降低运行效率。通过addScalar()方法设置返回数据的类型可以减少ResultSetMetaData对象的使用而提高运行效率。如:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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查询的持久对象有三种方式实现:
方式1:Hibernate不仅能把查询到的记录封装为包含多个Object数组的List对象返回,还可以把每一条查询到的记录封装成持久对象后返回包含这些对象的List对象。如:
1
2
3
4
5
6
7
|
String sql =
"select * from product limit 0,10"
;
SQLQuery sqlQuery = session.CreateSQLQuery();
sqlQuery.addEntity(Product .
class
);
List<Product> list = sqlQuery.list();
|
1
2
3
4
5
6
7
|
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();
|
1
2
3
4
5
6
7
8
9
10
|
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();
|