一、hql相比原生sql的缺点
1.配置关系复杂
2.复杂sql查询(多张表时,所以三张及以上介意用原生sql、视图、存储过程)
二、hql的通用分页
1.我们需要先建一个BaseDao去专门处理分页:
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();
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);
}
}
}
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);
Query countquery = session.createQuery(countHql);
this.setParameter(countquery, map);
String total = session.createQuery(countHql).getSingleResult().toString();
pageBean.setTotal(total);
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();
}
}