HIbernate 페이지 분할 문제 해결

4940 단어 Hibernate
Hibernate Criteria 페이지 에서 발생 하 는 문 제 는 페이지 를 나 누 려 면 총 기록 수 를 알 아야 한 다 는 것 을 잘 알 고 있 습 니 다. 이것 은 우리 에 게 작은 문 제 를 주 었 습 니 다. 흔히 우 리 는 Criteria 호출 list 방법 으로 모든 조회 결 과 를 되 돌려 주지 만 페이지 는 목록 으로 돌아 가기 전에 총 줄 수 를 받 아야 합 니 다.제 가 예전 에 한 방법 은 두 가지 방법 을 쓰 는 것 이 었 습 니 다. 매개 변 수 는 똑 같 습 니 다. 하 나 는 Integer, 즉 기록 수, 하 나 는 List, 결과 집 으로 돌아 가 는 것 입 니 다.이렇게 쓰 는 것 은 매우 번 거 로 운 것 같 습 니 다. 그리고 criteria. list () 로 기록 수 를 되 돌려 주 고 페이지 속성 을 설정 하 는 사람 도 있 습 니 다. 그러면 무슨 페이지 라 고 합 니까? list 를 호출 하여 데 이 터 를 메모리 에 불 러 왔 습 니 다. 그것 은 또 메모리 페이지 가 되 지 않 았 습 니 다. 이런 방법 은 프로그램 처리 가 간단 하고 성 이 떨 어 질 수 있 습 니 다.
오늘 인터넷 을 돌아 다 니 면서 새로운 방법 을 발 견 했 습 니 다. 코드 는 다음 과 같 습 니 다.
회색 기울 임 꼴 은 업무 관련 코드 입 니 다. 무시 하 십시오.
public Object doInHibernate(Session session) throws HibernateException, SQLException {
    Criteria criteria = session.createCriteria(XtLog.class);
    Criteria userCriteria = criteria.createCriteria("xtUser");
    Criteria lcCriteria = criteria.createCriteria("xtLogClass");
    if (StringUtils.isNotBlank(userId)) {
     userCriteria.add(Restrictions.like("userId", userId, MatchMode.START));
    }
    if (StringUtils.isNotBlank(logClassId)) {
     lcCriteria.add(Restrictions.eq("logClassId", logClassId));
    }
    if (beginDate != null && endDate != null) {
     criteria.add(Restrictions.between("xtOplogtime", beginDate, endDate));
    }
    int totalRows =((Integer) criteria.setProjection(Projections.rowCount()).uniqueResult()).intValue();
    psm.setTotalRows(totalRows);  // 비 즈 니스 코드 무시 하 세 요.
    criteria.setProjection(null);
    criteria.setResultTransformer(CriteriaSpecification.ROOT_ENTITY);
    Map orderMap = psm.getOrderMap();
    if(orderMap != null){
     setOrder(criteria, userCriteria, lcCriteria, orderMap);
    }
    if(!psm.isAll()){  // 페이지 를 나누다
     criteria.setFirstResult(psm.getRowStart());
     criteria.setMaxResults(psm.getPageSize());
    }
//    List < XtLog > logs = new ArrayList < XtLog > (); / / 로그 목록 을 되 돌려 줍 니 다.
//    List list = criteria.list();
//    for (Object[] o : list) {
//     logs.add((XtLog) o[2]);
//    }
//    return logs;
    return criteria.list();
   }
녹색 굵게 두 줄 의 코드 를 주의 하 십시오. 그것 은 바로 hibenate 가 총 줄 수 를 기록 하 는 쓰기 입 니 다. 목록 을 얻 는 방법 과 직접 쓰 는 것 입 니 다. 매우 간결 하고 기 똥 찬 것 같 습 니 다. 만약 당신 이 조회 한 것 이 표 라면 괜 찮 습 니 다. 그러나 제 가 조회 한 로 그 는 사용자 와 로그 분류 에 관련 되 어야 합 니 다. 맨 위 에 있 는 세 줄 의 코드 가 관련 되 어 있 습 니 다. 이때 페이지 로 돌아 가 는 것 을 발 견 했 습 니 다.면 후 보고 가 틀 렸 습 니 다. 그 이 유 는 제 가 원 하 는 로그 List 가 아니 라 Object [] 로 돌 아 왔 기 때 문 입 니 다.의 List, 각 List 에 있 는 세 개의 대상 배열, 주 표 의 배열 아래 표 시 는 마지막 입 니 다. 이때 저 는 파란색 글씨체 의 코드 를 사용 하여 다시 포장 한 후에 돌아 가 야 합 니 다. 저 는 이 문 제 를 해 결 했 지만 힘 이 되 지 않 고 완벽 하지 않 으 며 완벽 하지 않 습 니 다. 바로 불쾌 합 니 다. 빨간색 과 굵 은 글씨체 에 주 의 를 기울 여 쓰 면 됩 니 다.

return (PageSupport) getHibernateTemplate().execute(
                new HibernateCallback() ...{
                    public Object doInHibernate(Session session)
                            throws HibernateException ...{
                        Criteria criteria = detachedCriteria
                                .getExecutableCriteria(session);
                        
                        CriteriaImpl impl = (CriteriaImpl) criteria;

                        //  Projection OrderBy     ,       Count  
                        Projection projection = impl.getProjection();
                        
                        logger.debug("SQL: " + Projections.rowCount());
                        
                        
                         
                        //    
                        int totalCount = ((Integer) criteria.setProjection(Projections.rowCount()).uniqueResult()).intValue();

                        //    Projection OrderBy       
                        criteria.setProjection(projection);
                        if (projection == null) ...{
                            criteria.setResultTransformer(CriteriaSpecification.ROOT_ENTITY);
                        }
                     
                        
                        
                        List items = criteria.setFirstResult(startIndex)
                        .setMaxResults(pageSize).list();
                
                        PageSupport ps = new PageSupport(items, totalCount,
                                pageSize, startIndex);
                        
                        return ps;
                    }
                }, true);

1. criteria. setProjection (null); 총 수 를 얻 은 후 대상 목록 을 다시 얻 을 수 있 도록 합 니 다.

좋은 웹페이지 즐겨찾기