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<Object>形式,结构和解析方式跟hql中查询部分元素类似。
水平有限,感觉没把要表达的东西充分表达出来。。。总之技术这条路还要不断的磨练,不断尝试,大家共勉!