分页技巧_抽取出公共的分页用的Service方法
TopicAction.java
ForumAction.java
放在父类中DaoSupport.java
DaoSupportImpl.java
//@Transactional注解可以被继承,子类就不用写了 //@Transactional注解对父类中声明的方法无效 @Transactional @SuppressWarnings("unchecked") public abstract class DaoSupportImpl<T> implements DaoSupport<T> { @Resource private SessionFactory sessionFactory;// 通过注入得到SessionFactory,要把它放到容器里才能注入,在具体的实现类上声明@Repository private Class<T> clazz; public DaoSupportImpl() { //使用反射技术得到T的真实类型 ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();//获取当前new类型的泛型的父类类型 this.clazz = (Class<T>) pt.getActualTypeArguments()[0];//获取第一个类型参数的真实类型,只有一个泛型参数,所以写0 System.out.println("clazz--->" + clazz); } /** * 获取当前可用的session对象,用protected修饰方便子类得到session */ protected Session getSession() { return sessionFactory.getCurrentSession(); } public void save(T entity) { // 不需要自己关事务了,spring框架已经帮我们做了,我们用它的事务管理 getSession().save(entity); } public void update(T entity) { getSession().update(entity); } public void delete(Long id) { Object obj = getById(id); if (obj != null) { getSession().delete(obj); } } public T getById(Long id) { if(id == null) { return null; }else{ return (T) getSession().get(clazz, id); } } public List<T> getByIds(Long[] ids) { if(ids == null || ids.length == 0) { //return new ArrayList<T>();//返回空的集合 return Collections.EMPTY_LIST; }else { return getSession().createQuery(// "FROM " + clazz.getSimpleName() + " WHERE id IN (:ids)")// .setParameterList("ids", ids) .list(); } } public List<T> findAll() { return getSession().createQuery(// "FROM " + clazz.getSimpleName())// .list(); } //公共的查询分页信息的方法 public PageBean getPageBean(int pageNum, int pageSize, String hql, List<Object> parameters) { System.out.println("------>DaoSupportImpl.getPageBean()"); //查询本页的数据列表 Query listQuery = getSession().createQuery(hql);//创建查询对象 if(parameters != null) {//设置参数 for(int i = 0; i < parameters.size(); i++) { listQuery.setParameter(i, parameters.get(i)); } } listQuery.setFirstResult((pageNum - 1) * pageSize); listQuery.setMaxResults(pageSize); List list = listQuery.list();//执行查询 //查询总记录数量 Query countQuery = getSession().createQuery("SELECT COUNT(*)" + hql); if(parameters != null) {//设置参数 for(int i = 0; i < parameters.size(); i++) { countQuery.setParameter(i, parameters.get(i)); } } Long count = (Long)countQuery.uniqueResult();//执行查询 return new PageBean(pageNum, pageSize, count.intValue(), list); } }