本文转载,出处如下:http://bhdweb.iteye.com/blog/801084

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

Hibernate使用原生SQL(转载)的更多相关文章

  1. Hibernate执行原生SQL返回List<Map>类型结果集

    我是学java出身的,web是我主要一块: 在做项目的时候最让人别扭的就是hibernate查询大都是查询出List<T>(T指代对应实体类)类型 如果这时候我用的联合查询,那么返回都就是 ...

  2. hibernate使用原生SQL查询返回结果集的处理

    今天没事的时候,看到公司框架里有一个用原生SQL写的函数,说实在以前自己也干过这事,但好久都没有用,都忘得差不多了,现在基本都是用的hql语句来查询结果.hibernate中使用createSQLQu ...

  3. Hibernate SQLQuery 原生SQL 查询及返回结果集处理-1

    第一篇:官方文档的处理方法,摘自官方 在迁移原先用JDBC/SQL实现的系统,难免需要采用hibernat native sql支持. 1.使用SQLQuery hibernate对原生SQL查询执行 ...

  4. java:Hibernate框架3(使用Myeclipse逆向工程生成实体和配置信息,hql语句各种查询(使用hibernate执行原生SQL语句,占位符和命名参数,封装Vo查询多个属性,聚合函数,链接查询,命名查询),Criteria)

    1.使用Myeclipse逆向工程生成实体和配置信息: 步骤1:配置MyEclipse Database Explorer: 步骤2:为项目添加hibernate的依赖: 此处打开后,点击next进入 ...

  5. hibernate 5原生sql查询测试学习代码

    基本查询 import java.util.List; import org.hibernate.SQLQuery; import org.hibernate.Session; import org. ...

  6. Hibernate运行原生sql并将查询的结果转化为对象

    原生SQL查询执行的控制是通过SQLQuery接口进行的,通过执行Session.createSQLQuery()获取这个接口.下面来描述如何使用这个API进行查询.标量查询(Scalar queri ...

  7. Hibernate 的原生 SQL 查询

    Hibernate除了支持HQL查询外,还支持原生SQL查询.         对原生SQL查询执行的控制是通过SQLQuery接口进行的,通过执行Session.createSQLQuery()获取 ...

  8. hibernate使用原生SQL查询

    以下是Demo测试Hibernate 原生SQL查询: import java.util.Iterator; import java.util.List; import java.util.Map; ...

  9. 关于No Dialect mapping for JDBC type :-9 hibernate执行原生sql语句问题

    转自博客http://blog.csdn.net/xd195666916/article/details/5419316,同时感谢博主 今天做了个用hibernate直接执行原生sql的查询,报错No ...

随机推荐

  1. Oracle多关键字查询

    因项目需要,在某查询页面的查询字段支持多关键字查询,支持空格隔开查询条件,故实现如下: 使用的原理是:ORACLE中的支持正则表达式的函数REGEXP_LIKE, '|' 指明两项之间的一个选择.例子 ...

  2. 创建基本的2D场景(part2)

    让我们继续来学习Unity2D游戏场景的制作,本文分为以下3个部分: · 添加角色和控制 . 添加2D物理阻挡 · 添加2D效果 通过制作一个移动帽子接保龄球的小游戏,我们可以学习到任何创建游戏对象, ...

  3. Jmeter对基于websocket协议的压力测试

      WebSocket protocol 是HTML5一种新的协议.它实现了浏览器与服务器全双工通信(full-duplex).   浏览器和服务器只需要要做一个握手的动作,然后,浏览器和服务器之间就 ...

  4. 【Spring】基于注解的实现SpringMVC+MySQL

    目录结构: // contents structure [-] SprinigMVC是什么 SpringMVC工作原理 @Controller和@RequestMapping注解 @Controlle ...

  5. SharePoint Framework (SPFx)安装配置以及开发-基础篇

    前言 SharePoint Framework(SPFx),是页面 和Webpart的模型,完全支持本地开发(即完全可以脱离SharPoint环境在本地进行开发),SPFx包含了一系列的client- ...

  6. 斯坦福机器学习视频笔记 Week1 Linear Regression and Gradient Descent

    最近开始学习Coursera上的斯坦福机器学习视频,我是刚刚接触机器学习,对此比较感兴趣:准备将我的学习笔记写下来, 作为我每天学习的签到吧,也希望和各位朋友交流学习. 这一系列的博客,我会不定期的更 ...

  7. codewars-random(3)

    思路:两个嵌套的for循环(不推荐,应该有更好的.) 具体代码:function longestConsec(strarr, k) {    // your code    var n = strar ...

  8. python命令调用函数os.popen

    参考自xerosploit 描述:利用os.popen()函数调用系统命令nmap进行扫描,并用grep命令对扫描结果关键内容进行提取 代码 #!/usr/bin/env pthon #--*--co ...

  9. brew install nvm

    brew install nvm mkdir ~/.nvm nano ~/.bash_profilectrl+x 退出 source ~/.bash_profile echo $NVM_DIR nvm ...

  10. centos6.5 安装zabbix

    实验说明: 操作系统: CentOS6.5 64位 Web环境: Apache Mysql PHP zabbix版本: LTS 2.2.10 Linux服务器IP: 10.0.0.2 Linux客户端 ...