[Seasar-user:14383] Re: [DBFlute]外だしSQLのページング検索機能について質問
k.moriwaki
[E-MAIL ADDRESS DELETED]
2008年 5月 22日 (木) 15:01:13 JST
久保さん
森脇です、早速の回答ありがとうございます。
質問の件、了解しました。
たしかにJDBCの実装に依存してしまうのはまずいかもしれませんね。
以下余談ですが…
今回なぜこのような質問をしたかというと、リスト取得のSQLにGROUP BY が混ざっており、
件数を取得するときに
COUNT(DISTINCT(a.hoge_id))
みたいにしないと件数がとれず、それならいっそSQLは一回だけ発行で件数は
last()を使用して取れないか?と思ったからです。
# 発行してよいSQLの関数がPJで制限されており、DISTINCTが使えないのです…
2008/05/22 14:34 kubo <[E-MAIL ADDRESS DELETED]>:
> 久保です。
>
> 森脇さん、こんにちは
>
> http://dbflute.sandbox.seasar.org/contents/outside-sql/paging.html
>
> memberBhv.outsideSql().autoPaging().selectPage(...);
>
> の話ですね。
>
>> 確認なのですが、自動ページングでResultSetのすっ飛ばしを利用するのは
>> ページング絞りの条件設定のみで、総件数取得は必ずcountを取得するSQLを
>> 記述する必要があるということでしょうか?
>
> この認識であっています。
>
> ResultSetの「カーソルによるすっ飛ばし(absolute())」なので、
> 厳密にカウントが取得できません。
>
> 確かにnext()を繰り返すやり方なら簡単に取得できますが、
> その場合、結局パフォーマンスを犠牲にする可能性があります。
> (最後の行までぐるぐる回すことになってしまう)
>
> last()してgetRow()でパフォーマンス劣化せずに取得
> できるかもしれませんが、カーソルをサポートしてるしてないの
> DB依存な部分に左右されてしまうのと、
> JDBCの実装がそこまで信用できるのか!?っていうのもあり、
> カウントはもう一発SQLで取得することにしております。
> (last()で最後の行に移動するという行為がJDBCドライバ的に
> パフォーマンスの良いことなのかどうかが確認できてないのです。
> そこの部分に確証が取れれば検討の余地ありです)
>
>
> なのでお手数ですが、
>
> /*IF pmb.isPaging()*/
> select member.MEMBER_ID
> , member.MEMBER_NAME
> , ...
> -- ELSE select count(*)
> /*END*/
> where ...
> /*IF pmb.isPaging()*/
> order by UNPAID_PRICE_SUMMARY desc, member.MEMBER_ID asc
> /*END*/
>
> というように、
> A. 「Select句は、ELSEにselect count(*)」
> B. 「OrderBy句は、ページング実データ取得時のみ」
> と分岐させて下さい。
>
> 2008/5/22 k. moriwaki <[E-MAIL ADDRESS DELETED]>:
>> 森脇と申します。
>>
>> 外だしSQLのページング検索機能について質問です。
>>
>> 自動ページングの場合「ResultSetのすっ飛ばしを利用するページング」とあったので、
>> てっきり総件数の取得も同様の方法で取得するのかと思っていましたが、
>> 以降の説明ではcountを取得するSQLを記述すように書かれていました。
>>
>> 確認なのですが、自動ページングでResultSetのすっ飛ばしを利用するのは
>> ページング絞りの条件設定のみで、総件数取得は必ずcountを取得するSQLを
>> 記述する必要があるということでしょうか?
>> _______________________________________________
>> Seasar-user mailing list
>> [E-MAIL ADDRESS DELETED]
>> https://ml.seasar.org/mailman/listinfo/seasar-user
>>
> _______________________________________________
> Seasar-user mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-user
>
Seasar-user メーリングリストの案内