Hibernate使用原生SQL(转载)

本文转载,出处如下: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));

时间: 2024-12-07 16:46:39

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

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

今天没事的时候,看到公司框架里有一个用原生SQL写的函数,说实在以前自己也干过这事,但好久都没有用,都忘得差不多了,现在基本都是用的hql语句来查询结果.hibernate中使用createSQLQuery拉来来实现SQL语句的查询,具体用法:session.createSQLQuery(sql),对于用SQL返回的结果集是一个什么样的结果集都毫无记忆.自己查了下,才知道,原来是返回一个Object类型数组的list集合,而其中Object类型的数组里的值则与sql语句中的查询项相对应,如果是s

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

第一篇:官方文档的处理方法,摘自官方 在迁移原先用JDBC/SQL实现的系统,难免需要采用hibernat native sql支持. 1.使用SQLQuery hibernate对原生SQL查询执行的控制是通过SQLQuery接口进行的. Session.createSQLQuery(); 1.1标量查询 最基本的SQL查询就是获得一个标量(数值)的列表. sess.createSQLQuery("SELECT * FROM CATS").list(); sess.createSQL

Hibernate 的原生 SQL 查询

Hibernate除了支持HQL查询外,还支持原生SQL查询.         对原生SQL查询执行的控制是通过SQLQuery接口进行的,通过执行Session.createSQLQuery()获取这个接口.该接口是Query接口的子接口.         执行SQL查询步骤如下:         1.获取Hibernate Session对象         2.编写SQL语句         3.通过Session的createSQLQuery方法创建查询对象         4.调用SQ

Hibernate 使用原生SQL查询无法使用别名问题

最近遇到一个问题就是Hibernate在使用原生SQL进行多表联合查询别名的问题,一直报错,说是找不到某列,经过向别人咨询最后得出了解决方案 需要向数据库连接字符串中加入属性,具体如下 common.db.driverClassName=com.mysql.jdbc.Driver common.db.url=jdbc:mysql://10.10.11.8:3306/cm_mini_1?useOldAliasMetadataBehavior=true common.db.username=user

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

昨天解决一个看似很简单的需求, 我有一个类似下面的table(info_table),是收集产品使用的机型信息: id type model 1 nokia xxx1 2 nokia xxx2 3 Motorola yyyy1 4 Motorola yyyy2 5 Motorola yyyy3 要实现一个前台展示的页面: type countType nokia 2 Motorola 3 就这么简单的功能.相信稍微熟悉sql的人,马上就可以写出此实现.很惭愧的说,我的心里感觉很简单,由于很久没怎

Hibernate使用原生SQL语句进行无关联多表查询

背景:有两个表:CpCg与CpGg需要进行多表查询 因为CpGg表设计到与另外的表也有联系,因此师兄没有关联此两个表,只是用字段进行逻辑关联,CpGg表的cp字段与CpCg表的id字段逻辑关联 首先确保hibernate配置文件配置完成,配置文件如下:(一些与本人项目相关的关键字段已隐去) <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC

Hibernate SQLQuery原生SQL查询

使用Hibernate SQLQuery进行查询时,如果有两个列的列明相同,那么在取值时,Hibernate会取第一个同名列的值(在SQLPlus中会自动在列明后面跟上写字符进行区分).如: 1.SQL语句 SELECT * FROM (SELECT 'A' A, 'B' B FROM DUAL) TEMP_A, (SELECT 'C' A, 'D' B FROM DUAL) TEMP_B 2.Sqlplus查询结果: 3.Hibernate SQLQuery查询结果:

hibernate 执行原生sql 返回实体list对象

String sql="select gc.* from eportal_goods_category gc "+ " inner JOIN "+ " eportal_goods g on gc.id=g.goods_category_id "+ " INNER JOIN "+ " eportal_seller se on  g.supplier_id=se.id "+ " where se.id

Hibernate执行原生SQL

1.查询指定字段 public List<Object[]> getUseList( Integer index, Integer offset, String state, String search ){ String sqlSelect = "select user_id, user_name "; String sql = sqlSelect + " from users where user_status in (:state) limit :index