2

主にHQLを使用しています。しかし、私たちは多くの結合を含むこの複雑な検索フォームを持っているので、Criteria を使用して運を試してみようと思いました (これまでにない)。私は構文の方がはるかに気に入っており、私たちが持っている複雑なフォームに適合しています。

私の最初の本能は、 and.list().size()を適用する前に a を実行することでした。もちろん、これは遅くて怠け者であり、リソースを大量に消費します。setMaxResultssetFirstResult

少しグーグルした後、ScrollableResults を使用する例を見つけました。しかし、この投稿では、MySQL はカーソルをサポートしていないと述べています。これは 2004 年の投稿です。ここ 2012 年では、MySQL 5 と InnoDB テーブルを使用しています。だから私たちはカーソルをサポートしていると思います。次に、プロジェクションを使用することがわかりました。

したがって、Hibernate の第一人者ではないので、最善の道を迷っています。将来的にはDB2を使用する可能性があるため、どのソリューションを使用しても DB2 と MySQL 5 で動作する必要があると思います。

何か案は?少なくとも、カスタム HQL を使用してカウントを取得できると思います(*)。

ありがとう

アップデート

これを入れただけです:

ScrollableResults scr = crit.scroll();
scr.last();
int rowCount = scr.getRowNumber() + 1;

int rowCount = crit.list().size();

制限/開始値を設定する前の両方。それははるかに速く走りました。したがって、特定のDBと結果に対してカーソルが機能していると想定しています。私はそこにいくつかの結合を入れましたが、それでもはるかに高速であるようです。

これがまだ良い考えかどうかについて何か意見はありますか?

4

4 に答える 4

2

基準の を使用できますsetProjection(Projections.property("id"))

于 2012-11-09T20:03:11.217 に答える
1

setFirstResultとを使用してページネーションを適用する場合は、別のクエリでカウントを取得することが唯一のオプションだとsetMaxResults思います。

于 2012-11-09T16:19:50.753 に答える
0

確かcrit.list().size()に、行の完全なセットを Hibernate セッションのエンティティとしてロードします。

メソッドScrollableResults.last()は JDBC ドライバーの実装に依存しResultSet、Hibernate エンティティーがまだ作成されていない場合でも、完全にロードされる可能性があるため、非常に遅くなる可能性があります。

最良のオプションは、使用することですcrit.setProjection(Projections.rowCount()).uniqueResult()

于 2014-04-11T06:19:01.000 に答える
0

そして、コードに含めることができますhashcode()。つまり、

criteria.setProjection(Projections.rowCount()).uniqueResult().hashCode()
于 2014-10-01T08:26:39.363 に答える