29

hibernate と displaytag を使用してクエリ結果のページネーションを実行しようとしていますが、HibernateDetachedCriteriaオブジェクトが邪魔をしようと最善を尽くしています。説明させてください...

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();

PaginatedList の実装に Criteria オブジェクトを投げて、これらの線に沿って動作させることを考えています...

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()呼び出しによって条件オブジェクトが変更され、後続の呼び出しで使用できなくなるためです。呼び出しの順序は完全にはわかりませんが、データベースはgetFullListSize()" " を実行しようとするとエラーをスローしますが、select count(*) ... order by ...これは明らかに間違っています。

独自のオブジェクトを作成してクエリ条件を追跡し、呼び出しごとに Criteria オブジェクトを再構築することでこれを修正できると思いますが、それはさらに別の車輪を再発明するように感じます. おそらく最初に渡された基準をコピーし、そのコピーで作業する、よりスマートな方法はありますか?

更新getList:最初に呼び出さように見えるgetFullListSizeため、順序が渡されるとすぐにgetFullListSize失敗します。オブジェクトをコピー/リセットする必要なく、データベースに1回だけアクセスして(getList私が言うには)結果をキャッシュするCriteriaますが、それでも...

更新 (再度) : それは忘れてcountくださいselect。本当に 2 つの異なるCriteriaオブジェクトが必要です。

4

7 に答える 7

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

rowCount プロジェクションと基準自体の実行の間で基準を効果的に「リセット」します。

rowCount を実行する前に Order が追加されていないことを確認すると、処理が遅くなります。私の PaginatedList の実装では、結果を探す前に常にカウント クエリが実行されるため、順序付けは問題になりません。

于 2009-09-24T16:59:29.073 に答える
2

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

その投稿で、CriteriaTransformer.clone メソッドを見つけました。

これにより、基準オブジェクトがコピーされます。

getlist メソッドでプロジェクションを設定することもできます。

おっと、あなたが Java hibernate について言及していることに気づきませんでした。とにかく、これhttp://forum.hibernate.org/viewtopic.php?t=939039

フォーラムの投稿はあなたの質問に答えることができるはずです.

于 2008-12-15T19:21:17.677 に答える
1

醜いかもしれませんが、シリアライゼーションのトリックを使用してしまいました。DetachedCriteriaオブジェクトの構築時にオブジェクトをバイト配列にシリアル化し、必要に応じて逆シリアル化しますPaginatedList。ああ。

于 2008-12-17T11:58:10.330 に答える
-1
public static DetachedCriteria Clone(this DetachedCriteria criteria)
{
   var dummy = criteria.ToByteArray();
   return dummy.FromByteArray<DetachedCriteria>();
}
于 2010-07-17T10:44:46.687 に答える