重点:
- 1.回顾:
- 2、basedao的hql的通用分页
- 3、原生态sql和视图映射
重点分析:
上次回顾:
hql的查询五种结果处理方式:
1.object (查询所有、所有列段)
2、String (查询表格取单个列段)
3.map( new Map<> 取函数)
4.object[] (去某几个列段)
5.构造方法 (查询几列)
-
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<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();
//如果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<String, Object> 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();
}
}
}
-
原生sql
hql实现不了的功能,可以考虑使用原生sql1、配置关系麻烦
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_idsql->hql
-
视图映射
如果客户的要求多,跟我们查询语句就好复杂和sql或者hql过于重复
例如:
//获取订单表中的订单,订单项中的订单id,书籍表书籍。
select oi.selfNo,t.bname from t_hibernate_book b,t_hibernate_Oerder o,t_hibernate_Oerder_item oifunca(){ //获取订单表中的订单,订单项中的订单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、视图、存储过程等等