在hibernate分页中选择更多记录

时间:2018-02-23 08:20:06

标签: hibernate spring-mvc pagination datatables hibernate-criteria

问题:我正在尝试获取数据库中可用的所有记录(大约2000年)。它正在影响性能的应用。所以,我想分批获取像hibernate分页一样的记录。我也在UI端使用数据表,因此,如果不在页面上添加任何额外的按钮并使用数据表分页按钮来获取更多记录,如何进一步操作会让人感到困惑。

我尝试了什么:我已经尝试过hibernate分页,我在启动时选择前300行来获取。但是,我对如何获取其他记录感到困惑;使用UI上的额外按钮获取或使用所有新页面获取所有记录,并仅为此页面获取300条记录。另外,我不想在我的UI上添加任何其他按钮来获取记录。

Criteria criteria = getSession().createCriteria(Foo.class);
criteria.setFirstResult(totalCount-300);
criteria.setMaxResults(300);
List<Foo> fooList = fooList = query.list();

我正在使用带有hibernate的spring mvc。 我该怎么办?

1 个答案:

答案 0 :(得分:0)

我已经使用了这段代码,并成功地在我的 Spring MVC + Hibernate 示例中工作,

服务方法

注意:服务层中使用的所有类都在下面提到

public UserDataPaginator getUserListByPagination(PaginatorVO paginatorVO) {
    //calculate offset e.g. for Page = 0 the first record will be 0
    //for Page = 1 the offset is 10
    int offset = PaginatorUtility.getFirstResult(paginatorVO);
    int totalRecordsCount = userDAOImpl.getTotalNoOfRecords(paginatorVO);
    paginatorVO.setTotalNoOfRecords(totalRecordsCount);
    List<User> userList = userDAOImpl.getUserList(offset, paginatorVO);

    UserDataPaginator userDataPaginator = new UserDataPaginator();
    userDataPaginator.setPaginatorVO(paginatorVO);
    userDataPaginator.setUserVOList(transformUserListToUserVOList(userList));
    return userDataPaginator;
}

DAO方法userDAOImpl.java

public List<User> getUserList(int firstResult, PaginatorVO paginatorVO) {

    Session session = sessionFactory.getCurrentSession();

    Criteria criteria = session.createCriteria(User.class);

    if(paginatorVO.getOrder() != null && paginatorVO.getOrder().equals("asc") && paginatorVO.getSortBy() != null){
        criteria.addOrder(Order.asc(paginatorVO.getSortBy()));
    } else if(paginatorVO.getOrder() != null && paginatorVO.getSortBy() != null ){
        criteria.addOrder(Order.desc(paginatorVO.getSortBy()));
    } else {
        criteria.addOrder(Order.asc("firstName"));
    }
    criteria.setFirstResult(firstResult);
    criteria.setMaxResults(10);
    List<User> users = criteria.list();
    return users;
}

UserDataPaginator.java

用于发送包含

的响应对象

totalnumberOfRecords + pagenumber + usersList

public class UserDataPaginator {
    private List<UserDataVO> userVOList;
    private PaginatorVO paginatorVO;
    public List<UserDataVO> getUserVOList() {
         return userVOList;
    }
    public void setUserVOList(List<UserDataVO> userVOList) {
         this.userVOList = userVOList;
    }
    public PaginatorVO getPaginatorVO() {
         return paginatorVO;
    }
    public void setPaginatorVO(PaginatorVO paginatorVO) {
        this.paginatorVO = paginatorVO;
    }
}

PaginatorUtility.java

在这里,我编写了每页发送10条记录的逻辑。如果页码为0,那么它将返回0的偏移量,并从数据库中提取0-9条记录。

public class PaginatorUtility {

  public static int getFirstResult(PaginatorVO paginatorVO) {
      int offset = 0;
      if(paginatorVO.getPageNumber()!= 0) {
          offset = (paginatorVO.getPageNumber() - 1) * paginatorVO.getRecordsPerPage();
      } 
      return offset;
    }
}

PaginatorVO.java

用于传递conatins的请求对象,

Pagenumber + TotalNo.OfRecords(在客户端用于显示可用的页数)+ recordsPerPage(在客户端代码中使用)

public class PaginatorVO {

  private int pageNumber;
  private int totalNoOfRecords;
  private int recordsPerPage;
  private String sortBy;
  private String order;

  //getter setters
}

如果您还有任何疑问,可以询问

感谢。