- 浏览: 1229231 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (883)
- Spring (101)
- Swing (1)
- Mysql (21)
- Js (59)
- Jsp (2)
- Hibernate (19)
- Myeclipse (5)
- SqlServer 2000 (2)
- poi (15)
- Java (70)
- SSH (12)
- Html (47)
- Fusion Charts (1)
- C\C++ (2)
- 汇编 (36)
- Jquery (37)
- Struts2 (6)
- Ubuntu (16)
- powerDesinger (4)
- Jboss (3)
- JAX-RS (13)
- JAXB (5)
- JAX-WS (11)
- JMS (4)
- WebSocket (8)
- PHP (16)
- Flash (1)
- maven (3)
- Oracle (8)
- HttpClient (6)
- sqlserver (19)
- svn (5)
- Tomcat (3)
- Jdbc (3)
- EsayUi (11)
- 微信公众平台 (19)
- IIS (2)
- Freemarker (11)
- Comet (1)
- Spring MVC (85)
- JBoss Seam (3)
- 二维码 (9)
- Spring Security (4)
- Ehcache (3)
- Apache Shiro (7)
- jackson (16)
- JPA (8)
- jcaptcha (2)
- RSA (2)
- Ajax (6)
- 跟我学Shiro (0)
- Spring4 (19)
- 跟我学spring3 (0)
- css (32)
- excel (4)
- Filter (3)
- 微信公众帐号开发教程 (0)
- Android (6)
- log4j (6)
- 淘宝接口 (17)
- 支付集成 (3)
- 单点登录 (3)
- Html5 (27)
- 移动平台前端 (3)
- Linux (44)
- FusionCharts (27)
- Json Jackson Xml (5)
- 方培工作室-微信开发 (0)
- Apache与Tomcat与IIS整合 (10)
- Nginx (17)
- webService (2)
- apache (4)
- lucene (3)
- lodop (2)
- Shiro (3)
- zTree (2)
- ireport (12)
- Servlet3.0 (5)
- 前端美工 (19)
- AngularJS (1)
- C#开发微信门户及应用 (0)
- Shell (3)
- bat脚本 (16)
- Bootstrap (26)
- Less (10)
- photoshop (6)
- Redis (6)
- Mongodb (10)
- MyBatis (3)
- 数据结构 (0)
- 读写分离-主从复制 (0)
- JFinal (0)
- 百度地图api (3)
- hadoop-hbase-hive-spark (3)
- WebStorm (2)
- Quartz (5)
- ios (0)
- Mina (8)
- Android Studio (4)
- Ratchet教程 (0)
- 移动端重构系列 (1)
- cubic-bezier贝塞尔曲线CSS3动画工具 (1)
- nginx+tomcat+memcached集群 (0)
- 集群 (0)
- ZooKeeper (3)
- Dubbo (0)
- vpn (0)
- kafka (0)
- JVM垃圾回收机制 (0)
- 微信小程序 (0)
- Lua (0)
- Hystrix (0)
- Vue.js (0)
- mycat (0)
- Openresty (0)
- springBoot (0)
- 新分类 (0)
- guava (0)
- 大数据 (0)
- Sentinel (0)
最新评论
-
JackMacing:
中文怎么解决?
SpringMVC与iReport(JasperReports) 5.6整合开发实例 -
18335864773:
用pageoffice把.可以实现在线的文档操作.直接转pdf ...
转:使用jasperreport动态生成pdf,excel,html -
linhao0907:
推荐一款轻量开源的支付宝组件:https://github.c ...
关于Alipay支付宝接口(Java版) -
songronghu:
太好了,非常有用,谢谢分享~
Java ConcurrentModificationException 异常分析与解决方案 -
wzwahl36:
http://www.atool.org/json2javab ...
Java下利用Jackson进行JSON解析和序列化
Hibernate还支持使用SQL查询,使用SQL查询可以利用某些数据库的特性,或者用于将原有的JDBC应用迁移到Hibernate应用上。使用命名的SQL查询还可以将SQL语句放在配置文件中配置,从而提高程序的解耦,命名SQL查询还可以用于调用存储过程。
如果是一个新的应用,通常不要使用SQL查询。
SQL查询是通过SQLQuery接口来表示的,SQLQuery接口是Query接口的子接口,因此完全可以调用Query接口的方法:
● setFirstResult(),设置返回结果集的起始点。
● setMaxResults(),设置查询获取的最大记录数。
● list(),返回查询到的结果集。
但SQLQuery比Query多了两个重载的方法:
● addEntity,将查询到的记录与特定的实体关联。
● addScalar,将查询的记录关联成标量值。
执行SQL查询的步骤如下:
(1)获取Hibernate Session对象;
(2)编写SQL语句;
(3)以SQL语句作为参数,调用Session的createSQLQuery方法创建查询对象;
(4)如果SQL语句包含参数,调用Query的setXxx方法为参数赋值;
(5)调用SQLQuery对象的addEntity或addScalar方法将选出的结果与实体或标量值关联;
(6)调用Query的list方法返回查询的结果集。
看下面的SQL查询示例:
private void test() { //获取Hibernate Session对象 Session session = HibernateUtil.currentSession(); //开始事务 Transaction tx = session.beginTransaction(); //编写SQL语句 String sqlString = "select {s.*} from student s where s.name like '马军'"; //以SQL语句创建SQLQuery对象 List l = session.createSQLQuery(sqlString) //将查询到的记录与特定实体关联起来 .addEntity("s",Student.class) //返回全部的记录集 .list(); //遍历结果集 Iterator it = l.iterator(); while (it.hasNext()) { //因为将查询结果与Student类关联,因此返回的是Student集合 Student s = (Student)it.next(); Set enrolments = s.getEnrolments(); Iterator iter = enrolments.iterator(); while(iter.hasNext()) { Enrolment e = (Enrolment)iter.next(); System.out.println(e.getCourse().getName()); } } //提交事务 tx.commit(); //关闭Session HibernateUtil.closeSession(); }
上面的示例显示了将查询记录关联成一个实体的示例。事实上,SQL查询也支持将查询结果转换成标量值,转换成标量值可以使用addScalar方法,如:
Double max = (Double) session.createSQLQuery("select max(cat.weight) as maxWeight from cats cat") .addScalar("maxWeight", Hibernate.DOUBLE); .uniqueResult(); 或者: StringBuffer queryStr = new StringBuffer(); queryStr.append("select count(*) AA,"); queryStr.append("sum(st.num1) BB,sum(st.num2) CC,"); queryStr.append("max(st.cost1) DD,min(st.cost2) EE,"); queryStr.append("st.col1 FF from TBXXX st") .append(" where ") .append(SQLQuerySetup.createfilterStr(filter)) .append(" group by st.col1"); query = session.createSQLQuery(queryStr.toString()); query.addScalar("AA", new org.hibernate.type.IntegerType()); query.addScalar("BB", new org.hibernate.type.IntegerType()); query.addScalar("CC", new org.hibernate.type.IntegerType()); query.addScalar("DD", new org.hibernate.type.IntegerType()); query.addScalar("EE", new org.hibernate.type.IntegerType()); query.addScalar("FF", new org.hibernate.type.IntegerType()); return query.list();
注意2个问题
1.Query 没有addScalar()方法,使用SQLQuery才有addScalar()方法
2.如果查询的结果集的字段为id,count(*) as count,则如果只
addScalar("count",type),将得不到id的值,需要加上addScalar("id",type),也就是要把每一个字段都要addScalar()
使用SQL查询,如果需要将查询到的结果转换成特定实体,就要求为选出的字段命名别名。这别名不是随意命名的,而是以“/”实例名.属性名“/”的格式命名,例如:
//依次将多个选出的字段命名别名,命名别名时都以ss作为前缀,ss是关联实体的别名 String sqlStr = "select stu.studentId as {ss.studentNumber}," + "stu.name as {ss.name} from " + "student as stu where stu.name like '杨海华'"; List l = session.createSQLQuery(sqlStr) //将查询出的ss实例,关联到Student类 .addEntity("ss",Student.class) .list();
在第一个示例中,以{s.*}代表该表的全部字段,且关联实例的别名也被指定为s。
注意:如果不使用{s.*}的形式,就可让实体别名和表别名互不相同。关联实体的类型时,被关联的类必须有对应的setter方法。
4.5.1 命名SQL查询
可以将SQL语句不放在程序中,而放在配置文件中,这种方式以松耦合的方式配置SQL语句,可以提高程序解耦。
在Hibernate的映射文件中定义查询名,然后确定查询所用的SQL语句,然后就可以直接调用该命名SQL查询。在这种情况下,不需要调用addEntity()方法,因为在配置命名SQL查询时,已经完成了查询结果与实体的关联。
下面是命名SQL查询的配置片段:
<!-- 每个sql-query元素定义一个命名SQL查询 --> <sql-query name="mySqlQuery"> <!-- 关联返回的结果与实体类 --> <return alias="s" class="Student"/> <!-- 定义命名SQL查询的SQL语句 --> SELECT {s.*} from student s WHERE s.name like'杨海华' </sql-query>
sql-query元素是hibernate-mapping元素的子元素。因此,sql-query定义的名可以直接通过Session访问,上面定义的mySqlQuery查询可以直接访问,下面是使用该命名SQL查询的示例代码:
private void testNamedSQl() { //获取Hibernate Session对象 Session session = HibernateUtil.currentSession(); //开始事务 Transaction tx = session.beginTransaction(); //调用命名查询,直接返回结果 List l = session.getNamedQuery("mySqlQuery") .list(); //遍历结果集 Iterator it = l.iterator(); while (it.hasNext()) { //在定义SQL查询时,已经将结果集与Student类关联起来 //因此,集合里的每个元素都是Student实例 Student s = (Student)it.next(); Set enrolments = s.getEnrolments(); Iterator iter = enrolments.iterator(); while(iter.hasNext()) { Enrolment e = (Enrolment)iter.next(); System.out.println("====================================="); System.out.println(e.getCourse().getName()); System.out.println("====================================="); } } tx.commit(); HibernateUtil.closeSession(); }
4.5.2 调用存储过程
Hibernate 3增加了存储过程的支持,该存储过程只能返回一个结果集。
下面是Oracle 9i的存储过程示例:
CREATE OR REPLACE FUNCTION selectAllEmployments RETURN SYS_REFCURSOR AS st_cursor SYS_REFCURSOR; BEGIN OPEN st_cursor FOR SELECT EMPLOYEE, EMPLOYER, STARTDATE, ENDDATE, REGIONCODE, EID, VALUE, CURRENCY FROM EMPLOYMENT; RETURN st_cursor; END; 如果需要使用该存储过程,可以先将其定义成命名SQL查询,例如: <!-- 定义命名SQL查询,name属性指定命名SQL查询名 --> <sql-query name="selectAllEmployees_SP" callable="true"> <!-- 定义返回列与关联实体类属性之间的映射 --> <return alias="emp" class="Employment"> <!-- 依次定义每列与实体类属性的对应 --> <return-property name="employee" column="EMPLOYEE"/> <return-property name="employer" column="EMPLOYER"/> <return-property name="startDate" column="STARTDATE"/> <return-property name="endDate" column="ENDDATE"/> <return-property name="regionCode" column="REGIONCODE"/> <return-property name="id" column="EID"/> <!-- 将两列值映射到一个关联类的组件属性 --> <return-property name="salary"> <!-- 映射列与组件属性之间的关联 --> <return-column name="VALUE"/> <return-column name="CURRENCY"/> </return-property> </return> { ? = call selectAllEmployments() } </sql-query>
调用存储过程还有如下需要注意的地方:
● 因为存储过程本身完成了查询的全部操作,所以调用存储过程进行的查询无法使用setFirstResult()/setMaxResults()进行分页。
● 存储过程只能返回一个结果集,如果存储过程返回多个结果集,Hibernate将仅处理第一个结果集,其他将被丢弃。
● 如果在存储过程里设定SET NOCOUNT ON,将有更好的性能表现。当然也可以没有该设定。
发表评论
-
易百教程
2017-06-07 14:00 0http://www.yiibai.com/lua/l ... -
Hibernate原生SQL查询
2017-04-10 14:20 0http://blog.csdn.net/houpe ... -
Hibernate Shards 数据的水平、垂直切割
2016-08-13 10:29 0http://www.cnblogs.com/RicC ... -
DBCP,CP30,proxool连接池在spring hibernate中的配置
2015-07-13 11:16 0Java代码 用spring默认的连接 ... -
操作EntityManager
2015-03-01 10:31 4570操作EntityManager Interacting ... -
EntityManager实体操作
2015-03-01 10:24 717EntityManager 持久化实体 persi ... -
Could not write JSON: Infinite recursion (StackOverflowError) (through reference
2015-02-23 23:09 4767jackson 中的@JsonBackReference和@ ... -
jackson转换json出现无限递归问题
2015-02-23 23:07 4499环境:springmvc+hibernate+json ... -
hibernate的速度问题--hibernate.jdbc.fetch_size和 hibernate.jdbc.batch_size
2015-01-28 12:48 2112这点我也疑惑过,最初应用hibernate的项 ... -
Java泛型的使用以及注入DAO --由SpringSide想到的
2014-11-05 09:02 930DAO层的BaseHibernateDao类支持泛型,其目 ... -
宿舍管理系统
2012-03-04 00:26 1915项目名称 宿舍管理系统 开发工具 MyEclipse6.0+ ... -
S2SH问题点
2012-03-02 14:29 911Struts2: 为什么每次请 ... -
[转载]最新SpringMVC + spring3.1.1 + hibernate4.1.0 集成及常见问题总结
2012-02-28 09:51 1701下载地址 一 开发环境 1、动态web工程 ... -
Hibernate关联配置(XML)
2011-12-02 09:32 587多对一(many to one) 单向many-to-one ... -
Hiberante annotation 设置延迟加载
2011-10-13 09:24 959@ManyToMany(fetch = FetchType.L ... -
Hibernate -- 注解(Annotation)关系映射
2011-10-11 13:23 27781. Hibernate Annotation关系 ... -
struts2.1.6+hibernate3.3+spring3.0遇到的问题
2011-09-27 17:00 5046struts2.1.6+hibernate3.3+spring ... -
使用 Spring 2.5 注释驱动的 IoC 功能
2011-09-21 15:43 634概述 注释配置相对于 XML 配置具有很多的优势: 它可 ... -
Hibernate使用sql语句查询
2011-09-21 09:29 945import java.util.Iterator; imp ... -
org.hibernate.AnnotationException: No identifier specified for entity
2011-09-15 10:51 1049org.hibernate.AnnotationExcepti ...
相关推荐
当我们需要执行一些特殊的、复杂的或者非标准的SQL查询时, Hibernate的本地SQL查询功能就显得尤为实用。本文将深入探讨如何使用Hibernate将本地SQL查询的结果封装成对象。 首先,本地SQL查询(Native SQL)是指...
本篇文章主要探讨如何利用Hibernate实现动态SQL查询,结合XML配置和FREEMARKER模板引擎来生成执行的SQL语句。 一、Hibernate简介 Hibernate作为一款强大的持久层框架,它简化了Java应用程序与数据库之间的交互。...
利用MYSQL数据库提供的样例数据库world建立的查询小例子。已经建立好了数据库对应的...本项目主要是为了练习使用Hibernate查询数据库。如果有什么问题可以发站内信或者邮件asddf14@hotmail.com。我会尽量解答一下~~~
使用本地sql语句查询后,无需再使用Object对查询结果进行强制转换,而是直接将查询结果放到实体Bean里了。 PS: 其实只有一版,这里只所以叫最终版是因为该附件我上传了好几天传不上去,到最后报告说‘资源已经存在...
这篇博客"Hibernate SQLQuery 本地查询"可能详细讲解了如何利用Hibernate的SQLQuery类来执行SQL查询,以及如何在实际项目中结合BaseDaoSupport类实现数据访问。 首先,让我们理解SQLQuery的基本用法。在Hibernate中...
在Java开发中,Hibernate作为一个非常流行的ORM框架,提供了多种查询方式,其中就包括了HQL(Hibernate Query Language)和原生SQL查询。本文将针对给定代码片段中的核心知识点——如何在Hibernate中使用原生SQL而非...
然而,在一些情况下,我们需要直接执行原生 SQL 语句,而不是使用 Hibernate 的查询语言(HQL)。本文将介绍如何使用 Hibernate 执行原生 SQL 语句。 为什么需要执行原生 SQL 语句 在实际开发中,我们可能需要执行...
在某些情况下,开发者可能需要使用原生SQL查询来执行特定的数据库操作,这时就可以利用Hibernate的SQLQuery功能。本文将详细讲解如何使用Hibernate的SQLQuery进行本地SQL查询。 首先,创建SQLQuery实例是通过...
查询数据的方法有两种实现,一种是基于HQL(Hibernate Query Language),另一种是基于原生SQL。 - 基于HQL的通用查询: HQL是Hibernate提供的面向对象的查询语言,可以方便地操作对象和属性。`select`方法接收一个...
然而,尽管Hibernate提供了强大的HQL(Hibernate Query Language)和Criteria API,但在处理某些特定的、复杂的SQL查询时,可能无法满足需求,这时就需要用到“原生的Native SQL查询”。 Native SQL查询允许我们...
然而,在使用Hibernate执行SQL查询时,如果查询的目标表中存在char类型的字段,Hibernate有时会将该字段的数据映射成一个字符,而非完整的字符串。这主要是由于Hibernate默认的映射机制所导致的,即对于char类型的...
Hibernate会根据这些查询语句动态生成对应的SQL,并执行在数据库上。这极大地简化了数据库操作,同时保持了代码的可读性和可维护性。 模仿Hibernate生成SQL语句,我们可以从以下几个方面入手: 1. **实体类...
在开发过程中,为了调试和优化SQL查询,有时我们需要查看Hibernate生成的完整SQL语句,包括其参数值。通常,Hibernate默认输出的SQL语句会用问号(?)作为占位符,这在理解查询逻辑时可能会带来不便。本文将详细介绍...
本教程将详细解释如何使用Hibernate将本地SQL查询的结果封装成对象,以便更好地理解和应用这项技术。 1. Hibernate ORM简介: Hibernate是一个开源的ORM框架,它为Java应用程序提供了数据持久化的解决方案。它通过...
为了显示查询SQL,Hibernate 提供了`hibernatetool`,可以生成SQL脚本,或者通过配置`logging.level.org.hibernate.SQL`来打印SQL语句。此外,Hibernate的日志系统支持JDK Logging、Log4j 和 SLF4J。 **显示查询SQL...
如果你希望在配置文件中预定义一个原生SQL查询,可以使用`@NamedNativeQuery`注解。这使得代码更加整洁,易于管理。 ```java @Entity @Table(name = "User") @NamedNativeQuery( name = "User.findAll", ...
Hibernate允许在需要时直接执行SQL查询,如下所示: ```java String sql = "SELECT * FROM USER"; SQLQuery query = session.createSQLQuery(sql); query.addEntity(User.class); List<User> users = query.list();...
虽然Hibernate提供了ORM的方式,但有时我们可能需要使用原生的SQL查询来访问数据库,尤其是当ORM无法满足复杂需求时。在Hibernate中,可以通过以下方式执行原生SQL: 1. `Session.createSQLQuery(sql)`:创建一个...
hibernate.dialect 是一个 Hibernate Dialect 类名,允许 Hibernate 针对特定的关系数据库生成优化的 SQL。其取值为 full.classname.of.Dialect。 2. hibernate.show_sql hibernate.show_sql 参数用于输出所有 SQL...
在Java的Hibernate框架中,有时候我们需要执行自定义的SQL查询以获取特定的数据,这时就可以使用SQLQuery接口。本文将深入探讨Hibernate如何通过SQLQuery接口执行原生SQL查询,并展示如何处理查询结果。 一、创建...