如何实现??totalSize是计算出来的

解决方案 »

  1.   

    我们可以用hql查询转为sql查询,然后select count(1) from (select * from XXX)myTable。因在使用hibernate查询如用.list().size();这样会很占内存,如用select count(1) from hql,这样会要写很多select count(1) from 的hql语句所以我们可以在上面很简单,实用来得到totalSize.
      

  2.   

    spring roo 生成的程序用一次单独的查询来获得totalSize。
      

  3.   


    //////////////////////////  hql  paging   ///////////////////////////////
    public static Paging pagingByHQL(String dbAlias, String hql, Map paramMap, int pageSize, int currentPageNo)
    throws DaoException {
    try{
    ParamUtil.checkEmpty("hql", hql);
    }catch (IllegalArgumentException e) {
    throw new DaoException(e);
    }
    hql = SQLHandler.clearSqlNote(hql);
    Paging paging = new Paging();
    List pageList;
    Paging.checkPagSize(pageSize, paging);
    try{
    if (pageSize < 0) {//no paging
    pageList = setQueryParameters(createQuery(dbAlias, hql), paramMap).list();
    paging.setTotalSize(pageList.size());
    Paging.checkTotalSize(paging);
    Paging.refreshInit(paging);
    }else{//use paging
    QueryTranslatorImpl queryTranslator = compileHql(dbAlias, hql);
    SQLQuery sqlQuery = createSQLQuery(dbAlias,SQLHandler.getTotalSizeSql(queryTranslator.getSQLString()), false);
    if (null != paramMap && queryTranslator.getParameterTranslations().getNamedParameterNames().size() != 0){
    for(String paramName : (Set<String>)queryTranslator.getParameterTranslations().getNamedParameterNames()){
    int[] indexs = queryTranslator.getNamedParameterLocs(paramName);
    Object paramValue = paramMap.get(paramName);
    try{
    ParamUtil.checkParam(paramName, paramValue);
    }catch (IllegalArgumentException e) {
    throw new DaoException(e);
    }
    for (int index : indexs) {
    sqlQuery.setParameter(index, paramValue);
    }
    }
    // for (String paramName : (Set<String>) paramMap.keySet()) {
    // //sample parameter ,當然也可以用 SQLHandler 中的方法來分析字串
    // int[] indexs = queryTranslator.getNamedParameterLocs(paramName);
    // //when use a instance have question,parameter isn't sql class have question
    // //use invoke to set parameter.
    // Object paramValue = paramMap.get(paramName);
    // for (int index : indexs) {
    // //set sql parameter
    // sqlQuery.setParameter(index, paramValue);
    // }
    // }
    }
    paging.setTotalSize(Integer.parseInt((sqlQuery.list().get(0).toString())));
    if(paging.getTotalSize() > 0){
    paging.setCurrentPageNo(currentPageNo);
    Paging.refreshInit(paging);
    pageList = setQueryParameters(createQuery(dbAlias, hql), paramMap)
    .setFirstResult(paging.getStart()).setMaxResults(paging.getEnd()).list();
    }else{
    pageList = new ArrayList();
    }
    }
    }catch (HibernateException he) {
    throw new DaoException(new StringBuffer("dbAlias:").append(dbAlias)
    .append(",paging Query objects occur error!hql:\r\n\r\n").append(hql)
    .append("\r\n").append(Paramtor.getParamString((Map)(SQLHandler.getOriginalSQL(hql))[1], paramMap))
    .append("\r\nhqlToSql:\r\n\r\n").append(formatSql(compileHql(dbAlias, hql).getSQLString())).toString(), he);
    }
    paging.setPageList(pageList);
    return paging;
    }
    /////////////////////////////////////////////////////////////
      

  4.   


    public static String getTotalSizeSql(String parsedSql){
    return (new StringBuffer("SELECT COUNT(1) TOTALSIZE FROM(\r\n")).append(parsedSql).append("\r\n)MYTABLE").toString();
    }
      

  5.   

    select count(1) from eneityModel 
    dao层Query query = super.getHibernateSession().createQuery(hql);
    return (Integer) query.uniqueResult();
    就可以了
      

  6.   

    那要在dao层写大量的查询hql没有实现自动化,对于大的工程来讲代码重复量很大的,很简单的实现谁都可以很快的想到与完成,我在把这个提出来只是希望与我遇到同样问题的人。在用hibernate分页查询时要想非常方便的得到totalSize(性能上又很快)可以通过hql转为sql然后现用sql查询。package com.data;import java.util.List;import com.data.DBConfig;/**
     * 
     * @author asc123014
     *
     */
    public class Paging {
        private int size;
        private int pageSize;
        private int totalSize;
        private int currentPageNo;
        private int totalPageCount;
        private int start;
        private int end;
        private List pageList;
        private boolean hasNextPage;
        private boolean hasPreviousPage; public void setSize(int size) {
    this.size = size;
    }
    public int getSize() {
    return size;
    } public Paging(){
            pageSize = DBConfig.DEFAULT_PAGE_SIZE;
            setHasNextPage(false);
            setHasPreviousPage(false);
        }
        
    public void setPageSize(int pageSize) {
    this.pageSize = pageSize;
    }
    public int getPageSize() {
    return pageSize;
    }

    public void setTotalSize(int totalSize) {
    this.totalSize = totalSize;
    }
    public int getTotalSize() {
    return totalSize;
    }

    public void setCurrentPageNo(int currentPageNo) {
    this.currentPageNo = currentPageNo;
    }
    public int getCurrentPageNo() {
    return currentPageNo;
    }

    public void setTotalPageCount(int totalPageCount) {
    this.totalPageCount = totalPageCount;
    }
    public int getTotalPageCount() {
    return totalPageCount;
    }

    public void setStart(int start) {
    this.start = start;
    }
    public int getStart() {
    return start;
    }

        public void setEnd(int end) {
    this.end = end;
    }
    public int getEnd() {
    return end;
    }

    public void setPageList(List pageList) {
    this.pageList = pageList;
    }
    public List getPageList() {
    return pageList;
    } public void setHasNextPage(boolean hasNextPage) {
    this.hasNextPage = hasNextPage;
    }
        public boolean getHasNextPage(){
            hasNextPage = currentPageNo < totalPageCount;
            return hasNextPage;
        } public void setHasPreviousPage(boolean hasPreviousPage) {
    this.hasPreviousPage = hasPreviousPage;
    }
        public boolean getHasPreviousPage(){
            hasPreviousPage = currentPageNo > 1;
            return hasPreviousPage;
        }
        
        public static void checkPagSize(int pageSize,Paging paging){
    if (pageSize > DBConfig.MAX_PAGE_SIZE) {//可以更改設定文件DEFAULT_PAGE_SIZE=-1這樣就會直接查詢出全部
    throw new IllegalArgumentException(new StringBuffer("Can't set paging.pageSize! System limit MAX_PAGE_SIZE is:")
    .append(DBConfig.MAX_PAGE_SIZE).append(",but your setter caused pageSize is ")
    .append(pageSize).append("!").toString());
    }
    if(pageSize != 0){//為0時取默契值
    paging.pageSize = pageSize;
    }
        }
        /**
         * 如去掉不分頁totalSize限定可以取消checkTotalSize
         * @param paging
         */
        public static void checkTotalSize(Paging paging){
    if (paging.totalSize > DBConfig.MAX_PAGE_SIZE) {
    throw new IllegalArgumentException(new StringBuffer("Can't set paging.pageList! System limit MAX_PAGE_SIZE is ")
    .append(DBConfig.MAX_PAGE_SIZE).append(",but totalSize is ").append(paging.totalSize)
    .append("!").toString());
    }
        }
    public static void refreshInit(Paging paging) {
    //use rownm > ? and rownm <= ?  db ROWNUM start 1(先少于因查看前几页的概率要大于后面的页)
    //如paging.getCurrentPageNo()==0则currentPageNo=1,如paging.getCurrentPageNo()<0则currentPageNo=1pageCount
    //如paging.getCurrentPageNo() > pageCount则currentPageNo=pageCount,否则取paging.getCurrentPageNo()
    int start = 0;
    int end = paging.totalSize;
    int pageCount = 1;
    int currentPageNo = 1;
    if (paging.pageSize != -1) {
    pageCount = (paging.totalSize - 1) / paging.pageSize + 1;//得到查询sql实数pageCount
    currentPageNo = paging.currentPageNo < 1 ? (paging.currentPageNo == -1 ? pageCount : 1) :
    (paging.currentPageNo > pageCount ? pageCount : paging.currentPageNo);
    start = (currentPageNo - 1) * paging.pageSize;
    end = Math.min(currentPageNo * paging.pageSize, paging.totalSize);
    }
    paging.totalPageCount = pageCount;
    paging.currentPageNo = currentPageNo;
    paging.start = start;
    paging.end = end;
    paging.size = end - start;
    }
    }
      

  7.   

    上面的Paging是用来存入分页查询的相关信息。