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的数组。
(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();
2、返回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();
详细解决方案
Hibernate应用原生SQL
热度:62 发布时间:2016-05-05 13:07:39.0
相关解决方案
- hibernate 存入数据库当前时间
- hibernate DAO中加了局物,未提交
- hibernate 字段lazy 的兑现原理
- Hibernate 的query.list()的有关问题
- Hibernate 关联表字段赋值有关问题
- hibernate 联接mysql出错
- struts2 hibernate 分页有关问题
- hibernate与此同时使用多数据源?spring+hibernate
- hibernate 保留对象时,根据映射文件,无法获取主键值
- hibernate 多对1关联配置有关问题
- hibernate 一对1 ,插入不进去数据
- struts+spring+hibernate 开发,在action层调用service层接口,结果替null 注入失败,需高手帮忙
- SSH框架导入struts,hibernate,spring分先后顺序吗>>解决方法
- 请教小弟我不使用Myeclipse,可以在tomcat里面整合Spring,Hibernate,Struts2吗
- Hibernate 保存数据有关问题本人初学者
- hibernate 用hql怎么实现子查询
- struts hibernate,该如何处理
- hibernate hql "=:"符号?解决思路
- null id in com.bsw.gms.hibernate.pojo.Score entry (don't flush the Session after an exception occurs,该怎么解决
- Hibernate flush机制的了解
- 求 Hibernate 3.32 API 汉语言文档
- 求1 struts 2+hibernate+spring整合好的项目
- ,Struts2+Hibernate+Spring做一个网站
- hibernate Save 指定值为函数有关问题(ORACEL库)
- hibernate Query.createQuery(queryString).list();查询最大只有1000条数据,该怎么处理
- hibernate 联合主键自增有关问题
- 哪位高手能推荐下开源的购物网站源码(struts+hibernate+spring)
- Spring+Struct2+Hibernate 集成有关问题
- Hibernate 缓存配置无效,该怎么解决
- hibernate fectch = FetchType.LAZY 如何理解