hql2(查询分页加通用分页的方法)

重点:

  • 1.回顾:
  • 2、basedao的hql的通用分页
  • 3、原生态sql和视图映射

重点分析:

上次回顾:
hql的查询五种结果处理方式:
1.object (查询所有、所有列段)

2、String (查询表格取单个列段)

3.map( new Map<> 取函数)

4.object[] (去某几个列段)

5.构造方法 (查询几列)

  1. BaseDAO

    通过书籍名字模糊查询数据,并且具备分页的功能
    /**

    • 分页 的通用dao
    • sql:
    • jdbc:executeQuery(String sql ,PageBean pageBean,Class clz)
    • SQL: select * from t_hibernate_book where book_name like ‘%吧%’
    • 分页
    • 1、sql—>countSql —>total—>pageBean
    • 2.sql -->pageSql —>redult
    • 3、处理结果集
    • hql:
    • 分页
    • HQL: select * from t_hibernate_book where book_name like ‘%:book_name%’
    • 1、hql—>countHql —>total—>pageBean
    • 2.Hql -->pageSql —>redult(hibernate调用内置接口自动生成分页语句,查询结果)
    • 3、不需要处理结果集

代码分享:

public class BaseDao {

	/**
	 * 	将获取的值放入对象里面
	 */
	private  void setParameter(Query query,Map map) {
		if(map == null ||map.size()==0) {
			return;
		}
		
		Object value=null;
		//给query赋值
		for(Map.Entry entry : map.entrySet()) {
			value=entry.getValue();
			//如果vqlue是集合
			if(value instanceof Collection) {
				query.setParameterList(entry.getKey(), (Collection) value);
			}
			//如果vqlue是数组
			else if(value instanceof Object[]) {
				query.setParameterList(entry.getKey(), (Object[]) value);
			}
			//如果vqlue是8种数据类型
			else {
				query.setParameter(entry.getKey(), value);
				}
		}
	}
	
	
	/**
	 * 将从from后面转换我大写的
	 * 截取 from 后的hql,拼接hql语句
	 */
	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()){
			/*
			 * 第一步:将hql转换countHql ,获取总条目数
			 * 将其放入query,将值放入对象中
			 * 设置总条目数
			 */
			String countHql = getCountHql(hql);
			Query countQuery = session.createQuery(countHql);
			this.setParameter(countQuery, map);
			String total = countQuery.getSingleResult().toString();
			System.out.println("总条目数:"+total);
			pageBean.setTotal(total);
			
			/*
			 * 第二步:将hql转换为pageSql
			 * 然后将其返回
			 */
			Query pageQuery = session.createQuery(hql); 
			this.setParameter(pageQuery, map);
			pageQuery.setFirstResult(pageBean.getStartIndex());
			pageQuery.setMaxResults(pageBean.getRows());
			return pageQuery.list();
		}
		//不分页
		else {
			Query query = session.createQuery(hql);
			this.setParameter(query, map);
			return query.list();
		}
		
	}
	
	
	

	
	
	
}

  1. 原生sql
    hql实现不了的功能,可以考虑使用原生sql

    1、配置关系麻烦
    2、复杂sql查询

    需求:统计订单表中的订单对应的所有订单项中,某一书籍的销量。
    select oi.selfNo,t.bname from t_hibernate_book b,t_hibernate_Oerder o,t_hibernate_Oerder_item oi where o.orderid = oi.oid and b.bid = oi.product_id

    sql->hql

  2. 视图映射
    如果客户的要求多,跟我们查询语句就好复杂和sql或者hql过于重复
    例如:
    //获取订单表中的订单,订单项中的订单id,书籍表书籍。
    select oi.selfNo,t.bname from t_hibernate_book b,t_hibernate_Oerder o,t_hibernate_Oerder_item oi

     funca(){
     //获取订单表中的订单,订单项中的订单id,书籍表书籍加模糊查询书名。
     	select oi.selfNo,t.bname from t_hibernate_book b,t_hibernate_Oerder o,t_hibernate_Oerder_item oi
     	where bname like '%?%'
     }
     //获取订单表中的订单大于343,订单项中的订单id,书籍表书籍。
     funca(){
     	select oi.selfNo,t.bname from t_hibernate_book b,t_hibernate_Oerder o,t_hibernate_Oerder_item oi
     	where order_no > 343
     }
     //获取订单表中的订单,订单项中的订单id等于1213,书籍表书籍。
     funca(){
     	select oi.selfNo,t.bname from t_hibernate_book b,t_hibernate_Oerder o,t_hibernate_Oerder_item oi
     	where product_id = 1213
     }
     ////获取ddd表和订单表中的订单,订单项中的订单id,书籍表书籍的数据。
     funca(){
     	slect * from DDD,(select oi.selfNo,t.bname from t_hibernate_book b,t_hibernate_Oerder o,t_hibernate_Oerder_item oi)
     }
    

ps:
如果两张表查询建议使用hql语句,
如果三张表以上,可以考虑原生sql、视图、存储过程等等

你可能感兴趣的:(hibernate,eclipse,maven,m)