Hiberante4 原生SQL查询 例子

用hibernate4, 完全用ORM 做项目,原则上可以,其实有时候没有必要, 我见过有的项目为了取一个表的一条数据,而且只有一个字段的查询,居然也用hibernate 去做,更绝的是,这个查询里面还配置了 one to many 等关联,而且FetchType也不是lazy, 有必要这么做吗?我不是完全否决hibernate ,但用查询的时候,要注意什么时候该用Hibernate orM 去查,什么时候该自己去写 native sql 去查。

Hibernate4 native sql 查询其实很简单, 在前面的例子基础上,继续测试, 前面的例子可以参考这里,因为用到里面的数据表以及一些基本配置:
参考一:Hibernate4 mysql 采用XML 配置方式入门例子
参考一: Hibernate4 一对一双向主键关联测试例子
本例子用到的环境基本一样,唯一的区别在于测试类不同,原生SQL的测试类如下;
程序代码 程序代码

package com.yihaomen.hibernate4.test;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;

import com.yihaomen.hibernate.domain.Stock;
import com.yihaomen.hibernate.util.HibernateUtil;

public class AppTest
{  
     public static void main( String[] args )
        {
            System.out.println("Hibernate + MySQL");
            Session session = HibernateUtil.getSessionFactory().openSession();
            
            //session.beginTransaction();
            Query query = session.createSQLQuery(
            "select * from stock s where s.STOCK_CODE = :stockCode")
            .addEntity(Stock.class)
            .setParameter("stockCode", "4715");
            List<Stock> result = query.list();
            for(Stock stock : result){
                System.out.println((stock.getStockName()));
            }
            //session.getTransaction().commit();
        }

}



查看结果,可以看到hibernate native sql 正确的工作了,但请注意,在程序中用到了  .addEntity(Stock.class) ,如果没有这句话,那么程序的写法又不一样了。参考下面的例子:
程序代码 程序代码

public static void main( String[] args )
        {
            System.out.println("Hibernate + MySQL");
            Session session = HibernateUtil.getSessionFactory().openSession();
            
            
            Query query = session.createSQLQuery(
            "select * from stock s where s.STOCK_CODE = :stockCode")            
            .setParameter("stockCode", "4715");
            List result = query.list();
            for(Object stock : result){
                Object[] tmp = (Object[])stock;
                System.out.println(tmp[0].toString());
            }
          
        }


这个时候,Hibernate 返回的是一个 List<Object[]> 对象,得到这样的结果后,需要自己装箱,而采用addEntity的方式,Hibernate 会帮你装箱.

总结: 我并不认为用 Hibernate  的ORM 的查询会慢,在很多情况是由于程序员没有搞清楚表之间的关系,和用错了策略,导致Hibernate 去生成了一些不必要的语句,甚至去join 了一些不必要的表,但程序员总会给自己找个借口说是Hibernate  的问题,而去用native sql. 但是如果遇到有很大的性能瓶颈时,而且SQL语句非常复杂时,我还是推荐用原生的SQL的。

程序源代码下载:
下载文件 Hibernate native sql sample


除非申明,文章均为一号门原创,转载请注明本文地址,谢谢!
[本日志由 轻舞肥羊 于 2014-01-16 09:46 PM 编辑]
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags: hibernate
相关日志:
评论: 0 | 引用: 0 | 查看次数: -
发表评论
昵 称:
密 码: 游客发言不需要密码.
内 容:
验证码: 验证码
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.