문제

나는 최대 절전 모드 및 디스플레이를 사용하여 쿼리 결과 페이지를 작성하고 최대 절전 모드를하려고합니다. DetachedCriteria 물체는 방해가되기 위해 최선을 다하고 있습니다. 설명하겠습니다 ...

DisplayTag로 페이지 매김을하는 가장 쉬운 방법은 PaginatedList 다른 방법 중에는 다음 방법이있는 인터페이스입니다.

/* Gets the total number of results. */
int getFullListSize();

/* Gets the current page of results. */
List getList();

/* Gets the page size. */
int getObjectsPerPage();

/* Gets the current page number. */
int getPageNumber();

/* Get the sorting column and direction */
String getSortCriterion();
SortOrderEnum getSortDirection();

나는 PaginateList 구현을 기준 객체를 던지고 당신의 선을 따라 작동하도록 생각하고 있습니다 ...

getFullListSize() {
    criteria.setProjection(Projections.rowCount());
    return ((Long) criteria.uniqueResult()).intValue();
}

getList() {
    if (getSortDirection() == SortOrderEnum.ASCENDING) {
        criteria.addOrder(Order.asc(getSortCriterion());
    } else if (getSortDirection() == SortOrderEnum.DECENDING) {
        criteria.addOrder(Order.desc(getSortCriterion());
    }
    return criteria.list((getPageNumber() - 1) * getObjectsPerPage(),
                         getObjectsPerPage());
}

그러나 이것은 작동하지 않습니다 addOrder() 아니면 그 setProjection() 통화 기준 객체를 수정하면 연속 통화에 대해 사용할 수 없습니다. 통화의 순서를 전적으로 확신하지는 않지만 DB는 오류가 발생합니다. getFullListSize() "select count(*) ... order by ..."분명히 잘못되었습니다.

나는 쿼리 조건을 추적하고 각 호출의 기준 객체를 재건하기 위해 내 자신의 객체를 만들어이 문제를 해결할 수 있다고 생각하지만, 또 다른 휠을 재창조하는 것처럼 느껴집니다. 처음에 전달 된 기준을 복사하고 해당 사본 작업을 수행하는 더 똑똑한 방법이 있습니까?

업데이트: getList 첫 번째라고 불립니다 getFullListSize 순서가 전달 되 자마자 여러 번 호출됩니다. getFullListSize 실패합니다. 한 번만 DB를 치는 것이 합리적입니다 ( getList 나는 말하고) 그리고 결과를 캐시하고, 복사/재설정 할 필요가 없다. Criteria 물체이지만 여전히 ...

업데이트 (다시): 내가 한 일단 내가 한 일을 잊어 버려 count 나는 할 수 없다 select, 그 반대. 나는 정말로 두 가지가 필요합니다 Criteria 사물.

도움이 되었습니까?

해결책

글쎄, DetachedCriteria는 직렬화 할 수 있으므로 내장 된 경우 (무능한) 깊은 클론 지원이 있습니다. 초기 기준을 건설시 바이트 []로 직렬화 한 다음 사용하려는 경우마다 실조화할 수 있습니다.

다른 팁

Criteria.setProjection(null);
Criteria.setResultTransformer(Criteria.ROOT_ENTITY);

RowCount 프로젝션과 기준 자체의 실행 사이의 기준을 효과적으로 "재설정"합니다.

RowCount를 수행하기 전에 주문이 추가되지 않았는지 확인하면 속도가 느려집니다. PaginateList의 구현은 항상 결과를 찾기 전에 카운트 쿼리를 실행하므로 주문이 문제가되지 않습니다.

http://weblogs.asp.net/stefansedich/archive/2008/10/03/paging-with-nhibernate-using-acustom-extension-to-make-it-easier.aspx

그 게시물에서 나는 기준 antransformer.clone 메소드를 발견했습니다.

기준 객체를 복사해야합니다.

GetList 메소드에서 투영을 설정할 수도 있습니다.

Woops 나는 당신이 Java Hibernate를 언급하고 있음을 알지 못했습니다. 어쨌든, 이건 http://forum.hibernate.org/viewtopic.php?t=939039

포럼 게시물은 귀하의 질문에 답변 할 수 있어야합니다.

IT가 직렬화 트릭을 사용하여 끝났을 수도 있습니다. 나는 단지 일련의 DetachedCriteria 건설시 바이트 배열에 물체 PaginatedList 필요할 때 대상을하고 해제하십시오. 아야.

시도 할 가치가있는 또 다른 것 :

일반적인 dao와 같은 것을 구현하십시오 하나는 Hibernate의 사이트에서 제안했습니다 제한 개체와 함께 PaginateList 객체에 전달하십시오. 그런 다음 Paginintlist 객체는 같은 일을합니다

Criteria.forClass(myDAO.getPersistentClass())
        .add(myRestrictions)
        .addOrder(<someOrder>)

그리고

Criteria.forClass(myDAO.getPersistentClass())
        .add(myRestrictions)
        .setProjection(Projections.rowCount());

아직 시도하지는 않았지만 작동해야합니다.

public static DetachedCriteria Clone(this DetachedCriteria criteria)
{
   var dummy = criteria.ToByteArray();
   return dummy.FromByteArray<DetachedCriteria>();
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top