Hibernate与数据库交互的三种方式及数据解析

Hibernate是较为经典的JavaEE持久层框架,其设计初衷是为了减少sql语句的直接书写。目前,Hibernate有3种查询数据库的方法:HQL Query,Criteria Query,原生的sql查询。查询方式,只要懂一点sql很容易上手,而数据格式和解析方式却会给新手带来一定的困扰。日前由于公司产品迭代,需要更新升级部分后台接口,daoimpl中写的类似于

<pre name="code" class="java">TableName = "select new com.yf.entity.Assemble_GridSumXy(j.sumMonth, p.id, p.lat, p.lon, p.weight, j.griduser) "
					+ " from WorkSum j , WorkSumXY p ";
			sort = " and j.gradeId = p.gradeId ";
			DateTime = " where j.sumDate >= :startDate and j.sumDate < :endDate and ";


以及
return (List<WorkSum>) query.list();
都给代码的集成和可复用性带来了一定的困扰。楼主从后台数据查询返回的list为切入口,对代码进行重写构建。

第一种:HQL Query

     在daoimpl中:

public List<Object> getCollections(int collect_id) {
		// TODO Auto-generated method stub
		StringBuffer hql = new StringBuffer();
		hql.append(" from Collections p, Works j where p.user_id = j.user_id and p.collect_id= :collect_id ");
		Query query = getSession().createQuery(hql.toString());
		query.setParameter("collect_id", collect_id);
		return query.list();
	}
此时的<span style="font-family: Arial, Helvetica, sans-serif;">query.list()的返回结果是一个List<Object>的形式,深入的分析可知,List的每一个节点都是一个Object数组,该数组包含两个元素,分别是</span><span style="font-family: Arial, Helvetica, sans-serif;">Collections和</span><span style="font-family: Arial, Helvetica, sans-serif;">Works对象,在解析的时候,分别强转为相应的对象即可。</span>
<span style="font-family: Arial, Helvetica, sans-serif;">具体代码如下:</span><pre name="code" class="java">			Object[] obj=null;
			for(Object item: tempList){
				listMap = new HashMap<String, Object>();
				obj = (Object[])item;
				Collections c1= (Collections)obj[0];
				Works w1=(Works)obj[1];
				listMap.put("time", c1.getCollect_time());
				listMap.put("bz", w1.getBz());
				listMap.put("work_name", w1.getWorks_name());
				resultList.add(listMap);
			}
当然如果执意要只查询部分元素,可以采用
<span style="font-family: Arial, Helvetica, sans-serif;"></span><pre name="code" class="java">Object[] obj=null;
			for(Object item: tempList){
				listMap = new HashMap<String, Object>();
				obj = (Object[])item;
				Object c1= (Object)obj[0];
				Object w1=(object)obj[1];
				listMap.put("time",c1[0]);
<pre name="code" class="java"><span style="font-family: Arial, Helvetica, sans-serif;"></span><pre name="code" class="java">				listMap.put("oher",c1[1]);

listMap.put("bz", w1[0]);listMap.put("work_name", w1[1]);resultList.add(listMap);}

元素的顺序就是hql语句中元素的查询顺序。

第二种:Criteria Query

	<pre name="code" class="java">	@Override
	public List<Object> getWorks(int work_id) {
		// TODO Auto-generated method stub
		Criteria creteria = getSession().createCriteria(Works.class);
		creteria.add(Restrictions.eq("work_id", work_id));
		return (List<Object>) creteria.list();
	}


Criteria查询类似,只是在形式上有所差别。

第三种:原生sql

                StringBuffer sql =new StringBuffer();
		sql.append("select * from msg where user_id= ");
		sql.append(user_id);
		Query query = getSession().createSQLQuery(sql.toString());
		return query.list();
返回的结果也是一个List形式,结构和解析方式跟hql中查询部分元素类似。

水平有限,感觉没把要表达的东西充分表达出来。。。总之技术这条路还要不断的磨练,不断尝试,大家共勉!




相关内容推荐

Copyright © EchoJb.com