前期准备:
Customer实体类对应表
所要实现的功能:客户信息查询的多条件组合查询,而且查询结果需要分页
其中,一种方法是使用hibernate的find方法(未考虑分页)
核心代码如下:
//多条件组合查询
public List<Customer> findMoreCondition(Customer customer) {
//使用hibernate模板里面find方法实现
//拼接hql语句
String hql = "from Customer where 1=1 ";
//创建list集合,如果值不为空,把值设置到list里面
List<Object> p = new ArrayList<Object>();
//判断条件值是否为空,如果不为空拼接hql语句
if(customer.getCustName()!=null && !"".equals(customer.getCustName())) {
//拼接hql
hql += " and custName=?";
//把值设置到list里面
p.add(customer.getCustName());
}
if(customer.getCustLevel()!=null && !"".equals(customer.getCustLevel())) {
hql += " and custLevel=?";
p.add(customer.getCustLevel());
}
if(customer.getCustSource()!=null && !"".equals(customer.getCustSource())) {
hql += " and custSource=?";
p.add(customer.getCustSource());
}
// System.out.println("hql: "+hql);
// System.out.println("list: "+p);
return (List<Customer>) this.getHibernateTemplate().find(hql, p.toArray());
}
下面是利用使用离线对象(DetachedCriteria)和hibernate模板里面方法实现多条件查询并使用分页显示结果
核心代码如下:
Service层
public PageBean<Customer> multiSelect(Integer currentPage, Customer customer) {
PageBean<Customer> pageBean = new PageBean<Customer>();
Integer limit = 3;
pageBean.setCurrentPage(currentPage);
pageBean.setLimit(limit);
Integer totalCount = customerDao.findmultiselectCount(customer);
pageBean.setTotalCount(totalCount);
Integer totalPage = 0;
if (totalCount % limit == 0) {
totalPage = totalCount / limit;
} else {
totalPage = totalCount / limit + 1;
}
pageBean.setTotalPage(totalPage);
Integer begin = (currentPage - 1) * limit;
List<Customer> list = customerDao.multiSelect(begin, limit,customer);
pageBean.setList(list);
return pageBean;
}
Dao层
@Override
public List<Customer> multiSelect(Integer begin, Integer limit, Customer customer) {
DetachedCriteria criteria = DetachedCriteria.forClass(Customer.class);
if (customer.getCustName() != null && !customer.getCustName().trim().equals("")) {
criteria.add(Restrictions.like("custName", "%" + customer.getCustName() + "%"));
}
if (customer.getCustLevel() != null && !customer.getCustLevel().trim().equals("")) {
criteria.add(Restrictions.like("custLevel", "%" + customer.getCustLevel() + "%"));
}
if (customer.getCustSource() != null && !customer.getCustSource().trim().equals("")) {
criteria.add(Restrictions.like("custSource", "%" + customer.getCustSource() + "%"));
}
return this.getHibernateTemplate().findByCriteria(criteria, begin, limit);
}
@Override
public Integer findmultiselectCount(Customer customer) {
DetachedCriteria criteria = DetachedCriteria.forClass(Customer.class);
criteria.setProjection(Projections.rowCount()); //实现 select count(*) from Customer的功能
if (customer.getCustName() != null && !customer.getCustName().trim().equals("")) {
criteria.add(Restrictions.like("custName", "%" + customer.getCustName() + "%"));
}
if (customer.getCustLevel() != null && !customer.getCustLevel().trim().equals("")) {
criteria.add(Restrictions.like("custLevel", "%" + customer.getCustLevel() + "%"));
}
if (customer.getCustSource() != null && !customer.getCustSource().trim().equals("")) {
criteria.add(Restrictions.like("custSource", "%" + customer.getCustSource() + "%"));
}
List<Long> list = this.getHibernateTemplate().findByCriteria(criteria);
return list.get(0).intValue();
}
补充知识:
补充 setProjection(利用DetachedCriteria查询结果行数)
测试
但是有个bug:查询出来的结果,分页(前一页,后一页)会有bug,会丢失条件而重新查询所有数据,要解决这个bug的话,
可以copy一份原来的jsp页面,然后改变分页的链接去访问多条件查询方法(multiSelect);
或者在原来的显示页面通过判断来决定访问的是查询全部(findAll)的方法或者多条件查询方法(multiSelect);
或者不用分页,直接把查询结果显示到同一页。