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适应复杂数据查询相关推荐

  1. Hibernate使用原生SQL语句(left join左连接查询)

    Hibernate使用原生SQL语句 以下是本人对Hibernate使用原生SQL语句的理解: 在项目开发当中使用Hibernate提供的HQL有时候不能满足需求,尤其是多表查询或者是多表中没创建主外 ...

  2. Hibernate使用原生SQL查询

    Hibernate使用原生SQL查询   Hibernate提供了原生的SQL语句的查询,通过createSQLQuery(String)和createNativeQuery(String),crea ...

  3. SQL Server T-SQL数据查询

    SQL Server T-SQL数据查询 SELECT查询语句 SELECT语句的语法格式 SELECT [ALL|DISTINCT] 列表达式 [INTO 新表名] FROM 表名列表 [WHERE ...

  4. 数据库SQL语言学习--数据查询(持续更新中)

    数据库SQL语言学习--数据查询(持续更新中) 上机练习1 1.              启动SQL Server 2008中的 SQL Server Management Studio. 2.   ...

  5. JavaWeb学习笔记(数据库、SQL语句、数据查询语法、完整性约束、编码、备份和恢复数据、多表查询)

    数据库.SQL语句.数据查询语法.完整性约束.编码.备份和恢复数据.多表查询 JavaWeb学习笔记 数据库 数据库概念 基本命令 启动和关闭mysql服务器 客户端登录退出mysql SQL语句 S ...

  6. Hibernate对原生sql处理及结果集和VO的映射

    昨天解决一个看似很简单的需求, 我有一个类似下面的table(info_table),是收集产品使用的机型信息: id type model 1 nokia xxx1 2 nokia xxx2 3 M ...

  7. Hibernate执行原生SQL别名导致的一个Bug

    原生sql: select A.ID_ , A.NAME_, B.NAME_ from jbpm_task A inner join jbpm_processdefinition B on(A.PRO ...

  8. MS SQL入门基础:数据查询--SELECT语句

    数据库是为更方便有效地管理信息而存在的人们,希望数据库可以随时提供所需要的数据信息.因此,对用户来说,数据查询是数据 库最重要的功能.本章将讲述数据查询的实现方法. 在数据库中,数据查询是通过SELE ...

  9. SQL结构化数据查询语言培训讲义

    一.SQL语言 SQL是结构化的查询语言(Structured Query Language),是关系型数据库通讯的标准语言.第一代SQL产品是Oracle,它是当今关系型数据库技术的领导之一. 1. ...

最新文章

  1. [原创]关于javax.servlet.ServletException: File [/loginController/getVerifCode.jsp] not found异常 解决方案
  2. 华为访问列表traffic-policy案例
  3. Java 源码赏析 - java.lang - Void
  4. python redis 哨兵_Redis哨兵机制
  5. Linux之MySQL源码编译安装
  6. 19.多个版本的Netcat概览
  7. t–sql pl–sql_SQL存储过程–终极指南
  8. 苹果CMSv10_全站伪静态规则教程_宝塔Linux系统
  9. 【Urule源码解析1】开源可视化规则引擎
  10. 怎么快速提高网站打开速度-网站打开速度优化教程技巧
  11. 程序员的高效工作环境
  12. ~囍~ 将欢乐进行到底篇
  13. codeforces 407C Curious Array 数学
  14. excel用VBA插入列号
  15. Hive SQL练习之影评案例
  16. 基金规模越大,未来收益越差?小基金竟能跑赢大基金2倍。【邢不行】
  17. 一文详细理解计算机网络 - 数据链路层(考试和面试必备)
  18. EDR与态势感知,到底有啥区别?
  19. Linux rz 上传文件失败
  20. 易语言 mysql多线程_易语言数据库多线程 易语言数据库教程

热门文章

  1. 英语答题测试的软件叫什么,英语做题软件哪个好 有答案解析的英语做题软件分享...
  2. php鼠标悬停显示图片,鼠标滑过出现预览的大图提示效果
  3. SOCKET bind INADDR_LOOPBACK和INADDR_ANY的区别
  4. CentOS卸载OpenJDK并安装Sun JDK
  5. linux内核I2C子系统学习(一)
  6. 在CF卡上实现TrueFFS
  7. x210烧写流程(inand)
  8. 光耦驱动单向可控硅_华越国际一文带路:可控硅触发设计技巧
  9. 【转】细说.NET中的多线程 (三 使用Task)
  10. aop实现原理_Java:由浅入深揭开 AOP 实现原理