hql学习2:通用查询及分页 原生sql的使用以及视图的使用

本篇博客主要分享的内容:
1.创建BaseDao 通用查询加分页
2.hihernate中原生sql的使用
3.hibernate视图的使用

先来比较一下以下两种分页
1>平常 分页的Dao方法

public List list1(Book book,PageBean pagebean){
	Session session = SessionFactoryUtil.openSession();
	String hql="from  Book where 1=1";
	if(StringUtils.isNotBlank(book.getBookName())) {
		hql+=" and bookName like :bookName ";
	}
	Query query = session.createQuery(hql);
	
	if(StringUtils.isNotBlank(book.getBookName())) {
		query.setParameter("bookName","%"+book.getBookName()+"%" );
	}
	if(pagebean!=null&&pagebean.isPagination()) {
		query.setFirstResult(pagebean.getStartIndex());
		query.setMaxResults(pagebean.getRows());
	}
	
	List list = query.list();
	SessionFactoryUtil.closeSession();
	return list;
	
}		
		
		

2>通用分页
一…通用查询加分页 ,建立BaseDao

package com.zking.eight.util;

import java.util.Collection;
import java.util.List;
import java.util.Map;

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



/**
 * 分页通用
 * 
 * jdbc: executeQuery(String sql, PageBean pageBean, CallBack callback)
 *  select * from t_hibernate_book where book_name like '%红楼梦%'  已赋好值
 *  1.sql->countsql->total->pagebean
 *  2.sql->pagesql->result
 *  3.处理结果集
 *  
 *  
 *  hql:
 *  1.select * from Book where bookName like '%:bookName%'    赋值
 *  2.hql->counthql->tatal->pagebean
 *  3.hql->pagehql->result(hibernate调用内置接口自动生成分页语句 ,查询结果)
 * @author Administrator
 *
 */
public class BaseDao {

	/**
	 * 1.赋值
	 * @param query
	 * @param map
	 */
	//Map map 前台传递过来的参数
	
	public void setParamter(Query query,Map map) {
		if(map==null||map.size()==0) {
			return;
		}
		Object value=null;
		//给 query赋值
		for (Map.Entry entry : map.entrySet()) {
			 value=entry.getValue();
		 if(value instanceof Collection) {//如果是集合
				query.setParameterList(entry.getKey(), (Collection) value);
			}else if(value instanceof Object[]){//数组
				query.setParameterList(entry.getKey(),(Object[]) value);
			}else {
				query.setParameter(entry.getKey(), value);
			}
		 
		}
	}
	
	
/**
 * 2.查询总条目数的hql语句	
 * @param hql
 * @return
 */
private String getCountHql(String hql) {
	int index=hql.toUpperCase().indexOf("FROM");
	return "select count(*) " +hql.substring(index);
	
}	
	
	
public List executeQuery(String hql,PageBean pageBean,Map map,Session session) {
   if (pageBean != null && pageBean.isPagination()) {
		String countHql = getCountHql(hql);//查询总条目数的hql语句 未赋值
		Query countquery = session.createQuery(countHql);
		this.setParamter(countquery, map);//赋值
		String total = countquery.getSingleResult().toString();//获取总条目数
		pageBean.setTotal(total);
		
		Query pageQuery = session.createQuery(hql);//未分页
		this.setParamter(pageQuery, map);//赋值
		pageQuery.setFirstResult(pageBean.getStartIndex());
		pageQuery.setMaxResults(pageBean.getRows());
	    return pageQuery.list();
	}else {//查询所有
		Query query = session.createQuery(hql);
		this.setParamter(query, map);
		return query.list();
	}
		
}	
	
	
	
	
	
	
	
	
}

bookDao继承BaseDao ,调用通用方法

package com.zking.eight.dao;

import java.util.HashMap;
import java.util.List;
import java.util.Map;


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

import com.zking.eight.util.BaseDao;
import com.zking.eight.util.PageBean;
import com.zking.eight.util.StringUtils;
import com.zking.five.entity.Book;
import com.zking.two.util.SessionFactoryUtil;

public class BookDao extends BaseDao{

/**
 * baseDao通用分页  	 模糊查询加分页		
 * @param book
 * @param pageBean
 * @return
 */
public List list2(Book book,PageBean pageBean){
	Session session = SessionFactoryUtil.openSession();
	String hql="from  Book where 1=1";
	Map map=new HashMap<>();
	if(StringUtils.isNotBlank(book.getBookName())) {
		hql+=" and bookName like :bookName ";
		map.put("bookName", "%"+book.getBookName()+"%");
	}
	
	
	List list = super.executeQuery(hql, pageBean, map, session);
	
	
	SessionFactoryUtil.closeSession();
	return list;
	}
}		
				
		

显然 ,写一个通用的方法可以节省很多重复性的代码

二 .hibernate原生sql的使用
使用原生sql原因:
1、配置关系麻烦
2、复杂sql查询
hql实现不了的功能,可以考虑使用原生sql

/**
 * 原生态sql语句   多表查询		
 * @return
 */
public List list3(){
	Session session = SessionFactoryUtil.openSession();
	
	String sql="select b.book_name,o.order_no,oi.product_id from t_hibernate_book  b,t_hibernate_Order o,t_hibernate_Order_item oi ";
	List list = session.createSQLQuery(sql).list();
	
	
	SessionFactoryUtil.closeSession();
	return list;
	
}		
			

测试

 
   /**
    * 原生态sql语句   多表查询
    */
   @Test
   public void testList3() {
	 
	   List list1 = this.bookdao.list3();
	   for (Object[] b : list1) {
		System.out.println(Arrays.toString(b));
	}
	   
   }

三. hibernate视图的使用
在mysql中创建视图
hql学习2:通用查询及分页 原生sql的使用以及视图的使用_第1张图片


/**
 * 创建视图  查询
 * @return
 */
public List list4(){
	Session session = SessionFactoryUtil.openSession();
	
	String sql="select * from book_order_orderItemView ";//直接查询视图    跟list3一样的结果
	List list = session.createSQLQuery(sql).list();
	
	
	SessionFactoryUtil.closeSession();
	return list;
	
}	

你可能感兴趣的:(hql学习2:通用查询及分页 原生sql的使用以及视图的使用)