Hibernate 使用原生 Native SQL

本文介绍如何在Hibernate框架中利用Native SQL进行查询操作,通过一个工具类展示了执行原生MySQL语句的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

零.  前言

简单的查询一般都使用 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();



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值