Hibernate 使用原生 Native SQL

零.  前言

简单的查询一般都使用 HQL , 开发效率会比较高, 但是复杂的查询如果前期用 HQL , 那么后期出现慢查询, 就不得不用 原生 SQL 重写一遍, 要是滥用 HQL 返回各种对象, 用对象到处操作, 最后的慢查询调优简直就是条不归路。 笔者最近在做一个 10 年老项目的慢查询调优, 深有感悟, 本文只介绍 Hibernate 如何使用原生 SQL, 调优工作请看笔者其他文章。

一.  代码示例

使用原生 SQL 的工具类:

public SQLQuery findQueryByNativeSQL(final String sql, final List values, final int first, final int limit) {
   Object obj = this.getHibernateTemplate().execute(new HibernateCallback() {

      @Override
      public Object doInHibernate(Session session) throws HibernateException, SQLException {

         SQLQuery query = session.createSQLQuery(sql);
         query.setCacheable(true);
         if (values != null) {
            for (int i = 0; i < values.size(); i++) {
               query.setParameter(i, values.get(i));
            }
         }

         if (first > 0) {
            query.setFirstResult(first);
         }
         if (limit > 0) {
            query.setMaxResults(limit);
         }
         return query;
      }
   });
   if (obj != null) return (SQLQuery) obj;
   return null;
}

分页查询调用示例:

SQLQuery query = this.findQueryByNativeSQL(sql.toString(), values, pge * limit, limit);

举个最复杂的例子:可能返回内容比较复杂, 有对象, 有字段, 那么就需要有一个独立的 DTO 类去映射:

public class ArticleDTO implements Serializable {
 private Integer id;
private ArticleMeetingProp articleMeetingProp;
public ArticleMeetingProp getArticleMeetingProp() {
    return articleMeetingProp;
}

public void setArticleMeetingProp(ArticleMeetingProp articleMeetingProp) {
        this.articleMeetingProp = articleMeetingProp;
}
public Integer getId() {return id;}
public void setId(Integer id) {
this.id = id;
}
}

然后是上面返回的 query 的一些配置:

query.addEntity("articleMeetingProp", ArticleMeetingProp.class);
//query.addScalar(“id", Hibernate.INTEGER);  //如果字段有别名
query.setResultTransformer(Transformers.aliasToBean(ArticleDTO.class));

最终得到自定义的 DTO:

List<ArticleDTO> articleDTOList = query.list();

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-10 01:04:58

Hibernate 使用原生 Native SQL的相关文章

13.hibernate的native sql查询(转自xiaoluo501395377)

hibernate的native sql查询 在我们的hibernate中,除了我们常用的HQL查询以外,还非常好的支持了原生的SQL查询,那么我们既然使用了hibernate,为什么不都采用hibernate推荐的HQL查询语句呢?这是因为HQL查询语句虽然方便我们查询,但是基于HQL的查询会将查询出来的对象保存到hibernate的缓存当中,如果在我们的一个大型项目中(数据量超过了百万级),这个时候如果使用hibernate的HQL查询的话,会一次将我们查询的对象查询出来后放到缓存中,这个时

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+MySql+native SQL的BUG,以及解决办法

本来是mssql+hibernate+native SQL 应用的很和谐 但是到了把mssql换成mysql,就出了错(同样的数据结构和数据). 查询方法是: [java] view plaincopy String sql = "select id XXX_ID  from t_tab"; List<Map> list = session.createSQLQuery(sql) .setResultTransformer(Transformers.ALIAS_TO_ENT

Hibernate 的原生 SQL 查询

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

Hibernate使用原生SQL(转载)

本文转载,出处如下:http://bhdweb.iteye.com/blog/801084 HQL尽管容易使用,但是在一些复杂的数据操作上功能有限.特别是在实现复杂的报表统计与计算,以及多表连接查询上往往无能为力,这时可以使用SQL(Native SQL)实现HQL无法完成的任务. 1.使用SQL查询 使用SQL查询可以通过两种方式来实现: (1).利用Hibernate提供的SQLQuery对象执行.即可以通过Session对象的createSQLQuery()方法获取.如: String s

Native SQL

声明:原创作品,转载时请注明文章来自SAP师太技术博客:www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将追究法律责任!原文链接:http://www.cnblogs.com/jiangzhengjun/p/4293506.html Native SQL允许你针对数据库来使用原生的SQL,这些SQL可能是标准的SQL,也可以是某数据库特定的SQL.如果使用database-specific SQL语句,则数据库不能更换,否则请使用Open SQL.

hibernate使用setResultTransformer()将SQL查询结果放入集合中

在平时开发中Hibernate提供的hql基本能够满足我们的日常需求.但是在有些特殊的情况下,还是需要使用原生的sql,并且希望sql查询出来的结果能够绑定到pojo上.hibernate API中的createSQLQuery  和createQuery接口. 就像在这次的项目中,因为表结构要变化,有个新的需求: 要从一个表中查询极个别的字段并且还有几个是求多条数据的和的,之前一直在使用hibernate的API,使用的都是映射过得对象. 原对象及表结构是这样的: @Entity @Table

Open SQL和Native SQL到底有什么本质的区别

1.個人愚見:它們只是在实现的方式上,执行效率上不同,有的书上还说native sql存在一定风险 *& 20170521 171300 1.Open sql 是由创建数据库数据的ABAP命令构成的,在不同的DBMS(数据库管理系统)环境下其语法相同.OPEN SQL不能使用 DDL.DCL,只能使用类似于 select 语句的DML 语言.另外,还可以使用本地缓冲器,并且比NATIVE SQL的使用方法简单.ABAP 程序有激活时自动执行Syntax check特点. 2.Native SQL