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

本文介绍了如何在Hibernate中创建BaseDao实现通用查询与分页,探讨了原生SQL的使用场景及其与HQL的对比,并详细讲解了Hibernate视图的应用,包括创建与使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

public List<Book> 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<T> 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<String, Object> map 前台传递过来的参数
	
	public void setParamter(Query query,Map<String, Object> map) {
		if(map==null||map.size()==0) {
			return;
		}
		Object value=null;
		//给 query赋值
		for (Map.Entry<String, Object> 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<String, Object> 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<Book> list2(Book book,PageBean pageBean){
	Session session = SessionFactoryUtil.openSession();
	String hql="from  Book where 1=1";
	Map<String, Object> 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<Object[]> list1 = this.bookdao.list3();
	   for (Object[] b : list1) {
		System.out.println(Arrays.toString(b));
	}
	   
   }

三. hibernate视图的使用
在mysql中创建视图
在这里插入图片描述


/**
 * 创建视图  查询
 * @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;
	
}	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值