Hiberante4 原生SQL查询 例子

摘要: 用hibernate4, 完全用ORM 做项目,原则上可以,其实有时候没有必要, 我见过有的项目为了取一个表的一条数据,而且只有一个字段的查询,居然也用hibernate 去做,更绝的是,这个查询里面还配置了 one to many 等关联,而且FetchType也不是lazy, 有必要这么做吗?我不是完全否决hibernate ,但用查询的时候,要注意什么时候该用Hibernate orM 去查,什么时候该自己去写 native 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 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 对象,得到这样的结果后,需要自己装箱,而采用addEntity的方式,Hibernate 会帮你装箱.

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

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

上一篇: django 一次性上传多个文件, 批量上传
下一篇: Hibernate4 拦截器(Interceptor) 实现实体类增删改的日志记录
 评论 ( What Do You Think )
名称
邮箱
网址
评论
验证
   
 

 


  • 微信公众号

  • 我的微信

站点声明:

1、一号门博客CMS,由Python, MySQL, Nginx, Wsgi 强力驱动

2、部分文章或者资源来源于互联网, 有时候很难判断是否侵权, 若有侵权, 请联系邮箱:summer@yihaomen.com, 同时欢迎大家注册用户,主动发布无版权争议的 文章/资源.

3、鄂ICP备14001754号-3, 鄂公网安备 42280202422812号