Spring+Hibernate 复杂查询分页

本文介绍了一个简单的分页包装类及其实现方式,该类能够处理基本的分页逻辑,并配合UserDao接口完成复杂的查询需求。文章通过具体示例展示了如何进行分页查询,包括设置页面大小、计算总页数等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

网上多很多有分页例子,要么不全,要么不能满足复杂查询的要求,下面是本人写的一个初版,给大家参考。

/**分页包装类

很简单 :)

*/

package com.xing.cms.model.util;

public class Pager {
 private int totalPages = 0;
 private int totalObjects = 0;
 private int pageNumber = 1;
 private int pageSize = 3;
 private boolean pageAble = true;
 
 private int firstResult;
 

 public void calc(){
  totalPages =  totalObjects % pageSize == 0 ? totalObjects
    / pageSize : totalObjects / pageSize + 1;
 
  firstResult = (pageNumber - 1) * pageSize;
 }
 
 public boolean isPageAble() {
  return pageAble;
 }

 public void setPageAble(boolean pageAble) {
  this.pageAble = pageAble;
 }

 public int getTotalObjects() {
  return totalObjects;
 }

 public void setTotalObjects(int param) {
  this.totalObjects = param;
 }

 public int getTotalPages() {
  return totalPages;
 }

 public void setTotalPages(int param) {
  this.totalPages = param;
 }

 public int getPageNumber() {
  return pageNumber;
 }

 public void setPageNumber(int pageNumber) {
  this.pageNumber = pageNumber;
 }

 public int getPageSize() {
  return pageSize;
 }

 public void setPageSize(int pageSize) {
  this.pageSize = pageSize;
 }
 
 public String toString(){
  return("/ntotalPages:" + totalPages +
  "/ntotalObjects:" + totalObjects +
  "/npageNumber:" + pageNumber +
  "/npageSize:" + pageSize +
  "/npageAble:" + pageAble +
  "/nfirstResult:" + firstResult);
 }

 public int getFirstResult() {
  return firstResult;
 }

 public void setFirstResult(int firstResult) {
  this.firstResult = firstResult;
 }
}

/*UserDao 接口*/

package com.xing.cms.model.dao;

import java.util.List;

import com.xing.cms.model.businessobject.User;
import com.xing.cms.model.util.Pager;

public interface UserDao {
 public abstract boolean save(User model);
 public abstract boolean update(User model);
 public abstract User get(int id);
 public abstract boolean delete(int id);
 public abstract void truncate();
 public abstract boolean delete(int[] id);
 public abstract List<User> find(String[][] searchPara,Pager pager);
 public abstract List<User> find(String[][] searchPara);
}

/*UserDao实现*/

package com.xing.cms.model.dao.impl;

import java.sql.SQLException;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Hibernate;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
//import org.hibernate.criterion.Expression;
import org.hibernate.criterion.Restrictions;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import com.xing.cms.model.businessobject.User;
import com.xing.cms.model.dao.UserDao;
import com.xing.cms.model.util.GeneralTool;
import com.xing.cms.model.util.Pager;

public class UserDaoImpl extends HibernateDaoSupport implements UserDao {

 private JdbcTemplate jdbcTemplate;// Spring Injection

 public UserDaoImpl() {
  super();
 }

 public JdbcTemplate getJdbcTemplate() {
  return jdbcTemplate;
 }

 public void setJdbcTemplate(JdbcTemplate param) {
  this.jdbcTemplate = param;
 }

 @SuppressWarnings("unchecked")
 public List<User> find(final String[][] searchPara, final Pager pager) {

  return (List<User>) this.getHibernateTemplate().execute(
    new HibernateCallback() {
     public Object doInHibernate(Session session)
       throws SQLException, HibernateException {
      Criteria ca_count = null;
     
      if(pager.isPageAble())
       ca_count = session.createCriteria(User.class);//不能避免,需要查询两次数据库,这个获取总数
     
      Criteria ca = session.createCriteria(User.class);

      if(searchPara != null){
       ca.setProjection(null);
      for (int i = 0; i < searchPara.length; i++) {

       if (searchPara[i][1].equalsIgnoreCase("=")) {
        if(pager.isPageAble())
         ca_count.add(Restrictions.eq(searchPara[i][0], searchPara[i][2]));
        ca.add(Restrictions.eq(searchPara[i][0], searchPara[i][2]));
       } else if (searchPara[i][1].equalsIgnoreCase("like")) {       
        if(pager.isPageAble())
         ca_count.add(Restrictions.like(searchPara[i][0], searchPara[i][2],MatchMode.ANYWHERE));
        ca.add(Restrictions.like(searchPara[i][0], searchPara[i][2],MatchMode.ANYWHERE));
       
       }

      }
      }
 
      List ret_list;

      if (pager.isPageAble()) {

       pager.setTotalObjects(((Integer) (ca_count
         .setProjection(Projections.rowCount())
         .uniqueResult())).intValue()); //获取Count

 
       pager.calc();
      
       ca.addOrder(Order.desc("UID"));
       ca.setFirstResult(pager.getFirstResult());
       ca.setMaxResults(pager.getPageSize());
       ret_list = ca.list();
 
      } else {
       ca.addOrder(Order.desc("UID"));
       ret_list = ca.list();
      
      }

      return ret_list;
     }
    });
 }

// ......其它方法略去

 

/*测试类*/

 

package test;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.test.AbstractTransactionalDataSourceSpringContextTests;
import com.xing.cms.model.businessobject.User;
import com.xing.cms.model.dao.DocumentDao;
import com.xing.cms.model.dao.UserDao;
import com.xing.cms.model.util.HtmlGenerator;
import com.xing.cms.model.util.Pager;
import com.xing.cms.model.util.UtilXml;
import com.xing.cms.action.UserAction;

public class TestSpring extends AbstractTransactionalDataSourceSpringContextTests
{
 private Log logger = LogFactory.getLog(TestSpring.class);

 public String[] getConfigLocations() {
  String[] config = new String[]{"applicationContext.xml"}; 
  return config;
 }


 public void testUserAction() throws Exception{
 
  UserDao dao = (UserDao)applicationContext.getBean("userDao");
  assertTrue(dao!=null);
  User user = (User)applicationContext.getBean("user");
  assertTrue(user!=null);
  Pager pager = (Pager)applicationContext.getBean("pager");
  assertTrue(pager!=null);
  UserAction action = (UserAction)applicationContext.getBean("userAction");
  assertTrue(action!=null);
 
  //clear all first
  dao.truncate();
 
  //super.setComplete();
 
  //add
  for(int i=0;i<20;i++)
  {
   User u = new User();
   u.setGID(1);
   u.setUsername("xzw_"+i);
   u.setPassword("abcd");
   dao.save(u);
  }
 
 
 
  //no pager
 
  /*
  assertEquals(0,dao.find(
    new String[][]{
      new String[]{"username","=","xzw"}
    }
  ).size());
  assertEquals(20,dao.find(null).size());
  */
 
  //with pager
  //action.getPager().setPageSize(9);
  //10 11 12 ... 19 + 1 = 11
 
  /*分页,取第一页,前4 条,应该返回4*/
  action.getPager().setPageSize(4);
  assertEquals(4,dao.find(new String[][]{
    new String[]{"username","like","xzw_1"}
  },action.getPager()).size());

  /*不分页,则取全部的,应该返回20*/
  action.getPager().setPageAble(false);
  action.getPager().setPageSize(4);
  assertEquals(11,dao.find(new String[][]{
    new String[]{"username","like","xzw_1"}
  },action.getPager()).size());


 }
}

### 回答1: Active Directory服务是种由微软公司开发的网络服务,它提供了种集中管理和控制网络资源的方式。它可以在中集中管理用户、计算机、应用程序和其他网络资源,从而提高了网络的安全性和可管理性。Active Directory服务还提供了些高级功能,如单点登录、组策略管理和名系统(DNS)集成等,使得网络管理员可以更加轻松地管理和维护网络。 ### 回答2: Active Directory服务(Active Directory Domain Services,简称AD DS)是微软公司的项用于管理和组织网络资源的目录服务。它是种基于LDAP(轻量级目录访问协议)的目录服务,可以让用户和管理员方便地管理和访问网络中的资源。 AD DS的主要功能包括用户身份认证、访问控制、组管理和资源管理等。通过AD DS,管理员可以集中管理和配置用户和计算机的访问权限,确保系统安全。同时,AD DS还提供了的集中管理功能,管理员可以通过控制器管理中的所有对象,并在中实施策略。 AD DS还支持单点登录功能,用户只需在登录到之后,即可自动访问到所属中的资源,而无需再次输入用户名和密码。这大大提高了用户的工作效率。 此外,AD DS还支持多架构,可以通过建立信任关系实现跨资源的访问和管理。管理员可以维护多个之间的信任关系,实现用户和资源的统管理。 总而言之,AD DS是种强大的目录服务,可以实现用户和资源的集中管理和访问控制,提高网络系统的稳定性和安全性。它是企业网络管理的重要组成部分,为企业提供了高效的身份认证和资源管理功能,增强了企业的生产力和安全性。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值