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 投射文件中length属性无法改变integer字段的默认长度
- Exception in thread "main" org.hibernate.HibernateException: /hibernate.cfg.xml解决办法
- hibernate DAO中加了局物,未提交
- hibernate 字段lazy 的兑现原理
- Hibernate 的query.list()的有关问题
- Hibernate 关联表字段赋值有关问题
- 零配置的有关问题(struts2+Hibernate)
- hibernate 连接 oracle session 有关问题
- hibernate 中没有做一对多 , 那种关联映射的关联的话如何做连接查询
- hibernate 联接mysql出错
- 大神们开始觅错啦!org.hibernate.exception.SQLGrammarException: could not execute query
- struts2,hibernate,spring3 常用框架的API CHM版本,该怎么处理
- struts2,hibernate,spring3 惯用框架的API CHM版本
- struts hibernate 测试小例子 不报错 但数据库没反应 求分析项目在小弟我的资源里面
- struts2 hibernate 分页有关问题
- hibernate与此同时使用多数据源?spring+hibernate
- hibernate 保留对象时,根据映射文件,无法获取主键值
- hibernate 多对多添加有关问题,弄一天多了,请求大佬解答。小的 在此谢过了
- struts + hibernate 后台页面修改数据后,前台页面显示的内容新旧数据交替出现。请高手帮忙分析上原因
- hibernate 多对1关联配置有关问题
- Hibernate,级联保存为何无效?
- hibernate 一对1 ,插入不进去数据
- hibernate 连接oracle异常
- struts+spring+hibernate 开发,在action层调用service层接口,结果替null 注入失败,需高手帮忙
- Hibernate 映射有关问题
- SSH框架导入struts,hibernate,spring分先后顺序吗>>解决方法
- Hibernate 中的session怎么管理
- SSH框架(就是struts+spring+hibernate)是怎么搭建的
- 请教小弟我不使用Myeclipse,可以在tomcat里面整合Spring,Hibernate,Struts2吗