本篇博客主要分享的内容:
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
/**
* 创建视图 查询
* @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;
}