[Seasar-user:18765] Re: DBFluteにおけるPagingの件数取得について

kubo [E-MAIL ADDRESS DELETED]
2009年 10月 24日 (土) 16:33:22 JST


久保(jflute)です。

ご報告ありがとうございます。
要件を満たせたようで、なによりです。
(エラーメッセージはBETA3で直しました)

しばらくしたらDBFlute-0.9.6-RC1を出そうかと思います。

2009/10/23  <[E-MAIL ADDRESS DELETED]>:
>
> 久保さま
>
> お世話になっております.松原です.
>
> 正常に動作確認ができました!
>
> お騒がせして申し訳ございません.こちらの外だしSQLの不良でした.
> たまたま確認用の外だしSQLが,以下のようになっており,修正後,
> 確認したところ,正常に動作致しました.
>
> <エラー時の外だしSQL>
> --#City#
> --!CityPmb extends SPB!
> --!!String prefCode !!
>
> /*IF pmb.isPaging()*/
> select CODE, NAME
> --ELSE select count(*)
> /*END*/
> from xxx
> where P_CODE = /*pmb.prefCode*/'40'
> group by CODE, NAME
> /*IF pmb.isPaging()*/
> order by CODE asc
> /*END*/
>
>
> <改修版外だしSQL>
> --#City#
> --!CityPmb extends SPB!
> --!!String prefCode !!
>
> /*IF pmb.isPaging()*/
> select CODE, NAME
> --ELSE select count(*) from (select CODE, NAME
> /*END*/
> from xxx
> where P_CODE = /*pmb.prefCode*/'40'
> group by CODE, NAME
> /*IF pmb.isPaging()*/
> order by CODE asc
> --ELSE )
> /*END*/
>
> group by の集計関数を使用していたことをすっかり忘れていました.
> 申し訳ございません.
>
> また,通常のConditionBean及び上記ParameterBean(outsideSql)の
> checkSafetyResultの確認が取れ,期待通りの動作をしておりました.
> 大変有難うございます.
>
> また,こちらのメールサーバの不具合にて,メール取得ができないため,久保さまの
> 返信メールに送れないこと.合わせてお詫びいたします.
>
>
>
> 以上です.
>
>>久保さま
>>
>>
>> お世話になっております.松原です.
>>
>>正常に作成できました!!
>>大変有難うございましす.「basicInfoMap.dfprop」に
>>記載することで今までどおりの構成でクラスとdiconが生成されました.
>>
>>2009-01-29の日記は発見していましたが,0.9.4のバージョンで
>>生成できていたので,気付きませんでした.申し訳ございません.
>>
>>質問の繰り返しで心苦しいですが,「build.properties」の方の
>>「torque.isAvailableHotDeploy = true」は削除しても
>>問題ないでしょうか?
>>一応,削除して,正常に生成されていましたので,問題ないと思いました
>>が,念のため確認させて下さい.
>>
>>
>>また,BETA2で確認しところ以下のエラーの原因が特定できませんでした.
>>こちらの環境不正だと思いますが,以下のExceptionから気付くこと
>>があれば,ご教示頂けないでしょうか?
>>
>>(1) ページング指定をParameterBeanに設定していないため,エラーとなる
>>final CityPmb cityPmb = new CityPmb();
>>cityPmb.setPrefCode(code);
>>fainal Class<City> entityType = City.class;
>>cityPmb.checkSafetyResult(100);
>>try {
>>    final List<City> cityEntity = ocwTargetBhv.outsideSql().manualPaging().selectPage(OcwTargetBhv.PATH_selectCity, cityPmb, entityType);
>>    // 指定件数以内
>>} catch (DangerousResultSizeException e) {
>>    // 指定件数以上
>>    System.out.println(e.getActualResultSize());
>>}
>>
>>==== Exceptionの内容
>> (java.lang.IllegalStateException) java.lang.IllegalStateException: The paging bean is not effective about fetch-scope! When you select page, you should set up fetch-scope of paging bean(Should invoke fetchFirst() and fetchPage()!). The paging bean is: CityPmb:{40}
>>
>>(2) ページングを使用しているが,結果がEntity(1件取得)と予定されてしまい,エラーとなる
>>final CityPmb cityPmb = new CityPmb();
>>cityPmb.setPrefCode(code);
>>cityPmb.paging(100, 1);
>>fainal Class<City> entityType = City.class;
>>cityPmb.checkSafetyResult(100);
>>try {
>>    final List<City> cityEntity = ocwTargetBhv.outsideSql().manualPaging().selectPage(OcwTargetBhv.PATH_selectCity, cityPmb, entityType);
>>    // 指定件数以内
>>} catch (DangerousResultSizeException e) {
>>    // 指定件数以上
>>    System.out.println(e.getActualResultSize());
>>}
>>
>>==== Exceptionの内容
>> (org.seasar.dbflute.exception.EntityDuplicatedException) org.seasar.dbflute.exception.EntityDuplicatedException: Look! Read the message below.
>>/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
>>The entity was too many! it has been duplicated.
>>It should be the only one! But the resultCount: 114
>>
>>[Advice]
>>Confirm your search condition. Does it really select the only one?
>>And confirm your database. Does it really exist the only one?
>>
>>
>>度々申し訳ございませんが,宜しくお願い致します。
>>
>>以上です.
>>
>>
>>>久保(jflute)です。
>>>
>>>まずはbasicInfoMap.dfpropにて、
>>>「isAvailableHotDeploy = true」
>>>と設定されているかご確認下さい。
>>>
>>>
>>>2009/10/22  <[E-MAIL ADDRESS DELETED]>:
>>>> 久保さま
>>>>
>>>>
>>>> お世話になっております.松原です.
>>>>
>>>> 大変申し訳ございませんが,以下の手順でDBFluteを実行させた結果,
>>>> HotDeployで正常に生成できないようになってしまいました.
>>>> 原因など心当たりがありましたら,ご教示頂けないでしょう?
>>>>
>>>>
>>>> 【変更前環境】
>>>> ・DBFlute:0.9.4
>>>> ・依存Jar:aopalliance-1.0.jar
>>>>  commons-logging-1.1.jar
>>>>  dbflute-runtime.jar
>>>>  dbflute.jar
>>>>  derby-10.1.2.1.jar
>>>>  geronimo-ejb_2.1_spec-1.0.jar
>>>>  geronimo-j2ee_1.4_spec-1.0.jar
>>>>  geronimo-jta_1.1_spec-1.0-tsr.jar
>>>>  geronimo-jta_1.1_spec-1.0.jar
>>>>  h2-1.0.20061103.jar
>>>>  hsqldb-1.8.0.1.jar
>>>>  javassist-3.4.ga.jar
>>>>  junit-3.8.2.jar
>>>>  junit-addons-1.4.jar
>>>>  log4j-1.2.13.jar
>>>>  ognl-2.6.9-patch-20070908.jar
>>>>  ojdbc14.jar
>>>>  poi-3.0-FINAL.jar
>>>>  portlet-api-1.0.jar
>>>>  s2-dao-1.0.50.jar
>>>>  s2-extension-2.4.34.jar
>>>>  s2-framework-2.4.34.jar
>>>>  uow_api-6.jar
>>>>
>>>> 【変更後環境】
>>>> ・DBFlute:0.9.5.5
>>>> ・依存Jar:aopalliance-1.0.jar
>>>>  commons-collections-2.1.jar
>>>>  commons-lang-1.0.1.jar
>>>>  commons-logging-1.1.jar
>>>>  dbflute-runtime-0.9.6-BETA2.jar
>>>>  dbflute.jar
>>>>  derby-10.5.1.1.jar
>>>>  geronimo-ejb_2.1_spec-1.0.jar
>>>>  geronimo-j2ee_1.4_spec-1.0.jar
>>>>  geronimo-jta_1.1_spec-1.0-tsr.jar
>>>>  geronimo-jta_1.1_spec-1.0.jar
>>>>  h2-1.1.118.jar
>>>>  hsqldb-1.8.0.1.jar
>>>>  javassist-3.4.ga.jar
>>>>  junit-3.8.2.jar
>>>>  junit-addons-1.4.jar
>>>>  log4j-1.2.13.jar
>>>>  mysql-connector-java-5.1.8-bin.jar
>>>>  ognl-2.6.9-patch-20070908.jar
>>>>  ojdbc14.jar
>>>>  poi-3.2-FINAL-20081019.jar
>>>>  portlet-api-1.0.jar
>>>>  postgresql-8.3-603.jdbc3.jar
>>>>  s2-dao-1.0.50.jar
>>>>  s2-extension-2.4.34.jar
>>>>  s2-framework-2.4.34.jar
>>>>  uow_api-6.jar
>>>>  velocity-1.3.1.jar
>>>>
>>>> 【変更内容】
>>>> (1)DBFlute0.9.4 から0.9.5.5への移行で特に意識する点はないと
>>>> 思いましたので,DBFlute0.9.4のHotDeploy対応環境から以下の
>>>> フォルダを更新しました.
>>>>
>>>> ・mydbflute
>>>> DBFlute0.9.4 ⇒ DBFlute0.9.5
>>>>
>>>> (2)mydbfluteのテンプレートをHotDeploy対応に修正しようと思い
>>>> ましたが、既に同一内容となっていましたので,以下のファイル
>>>> の更新はしませんでした.(一応,上書きでも確認)
>>>>
>>>> /templates/om/java/allcommon/container/seasar/hotdeploy/CreatorDicon.vm
>>>> /templates/om/java/allcommon/container/seasar/hotdeploy/CustomizerDicon.vm
>>>>
>>>> 結果,mydbfluteのみ更新し,DBFluteを実行すると,以下の結果となりました.
>>>>
>>>> ・dbflute-xxx.dicon:全コンポーネントの定義が生成しまう(The components of Behavior以降が展開)
>>>> ・aaa.bbb.ccc.dbflute.allcommon.s2container.BehaviorCreator.javaが生成されない
>>>>
>>>>
>>>> こちらの移行手順ミスとは思いましたが,前回確認させて頂いたHotDeployの手順から
>>>> 問題点が分かりませんでしたので,ご相談させて頂きました.
>>>>
>>>>
>>>> 申し訳ございませんが,宜しくお願い致します.
>>>>
>>>>
>>>> 以上です.
>>>>
>>>>>久保さま
>>>>>
>>>>> お世話になっております.松原です.
>>>>>
>>>>>大変有難うございます.まずは,BETA2で確認してみます.
>>>>>
>>>>>
>>>>>お忙しいところの対応,誠に有難うございました.
>>>>>
>>>>>
>>>>>以上です.
>>>>>
>>>>>>久保(jflute)@りんかい線です。
>>>>>>
>>>>>>すいません、チェックのタイミングを間違って、
>>>>>>実データ後にチェックしちゃってました。
>>>>>>件数取得の後で実データ取得の前のタイミングで
>>>>>>チェックするように直しました。
>>>>>>(BETA2を上書きしています)
>>>>>>
>>>>>>2009/10/21 kubo <[E-MAIL ADDRESS DELETED]>:
>>>>>>> 久保(jflute)です。
>>>>>>>
>>>>>>> ちょっと出かける直前で取り急ぎということで、
>>>>>>> 「DBFluteランタイム-0.9.6-BETA2」にて反映しました。
>>>>>>> (Mavenリポジトリにアップしています)
>>>>>>> DBFluteモジュールは0.9.5.5のままOKです。
>>>>>>> もしよければ、お試し頂けると助かります。
>>>>>>>
>>>>>>> 2009/10/21  <[E-MAIL ADDRESS DELETED]>:
>>>>>>>> 久保さま
>>>>>>>>
>>>>>>>> お世話になっております.松原です.
>>>>>>>>
>>>>>>>>
>>>>>>>> 度々申し訳ございません.こちらで検討したところ,
>>>>>>>> 久保さまのご提示案が一番効率的と分かりました.
>>>>>>>> 先程のメール大変申し訳ございません.破棄して下さい.
>>>>>>>>
>>>>>>>> こちらの認識は以下の通りです.
>>>>>>>>
>>>>>>>> // 先ずは,100件をセット
>>>>>>>> pmb.checkSafetyResult(100);
>>>>>>>>
>>>>>>>> try {
>>>>>>>>    xxxBhv.outsideSql().manualPaging().selectPage(...);
>>>>>>>>    // 100件以内のなで,※ 結果, Count(*)とデータ取得の2回のSQLが実行
>>>>>>>>
>>>>>>>> } catch (DangerousResultSizeException e) {
>>>>>>>> // エラーとなったので, ※ Count(*)の1回のみが実行されている
>>>>>>>>
>>>>>>>>    // 以下の取得件数からワーニングを切替える
>>>>>>>>    メッセージ出力
>>>>>>>>
>>>>>>>>    // ユーザが表示とした場合
>>>>>>>>    if (e.getActualResultSize() > 10000) {
>>>>>>>>        // 999件以内
>>>>>>>>        xxxBhv.outsideSql().selectList();
>>>>>>>>
>>>>>>>>      // 結果,※ Count(*)×2回とデータ取得の1回のSQLが実行
>>>>>>>>    } else {
>>>>>>>>        // 10000件以上
>>>>>>>>        pmb.fetchFirst(10000);
>>>>>>>>        xxxBhv.outsideSql().autoPaging().selectPage
>>>>>>>>
>>>>>>>>      // 結果,※ Count(*)×2回とデータ取得の1回のSQLが実行
>>>>>>>>
>>>>>>>>    }
>>>>>>>>
>>>>>>>> という結果となり,一番効率的であり(DB検索),データ転送量が少ない方式であると
>>>>>>>> 分かりました.
>>>>>>>>
>>>>>>>>
>>>>>>>> 不躾ですが,重ねて,ご提示機能の検討をお願い致します.
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> 以上です.宜しくお願い致します.
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>>久保さま
>>>>>>>>>
>>>>>>>>> お世話になっております.松原です.
>>>>>>>>>
>>>>>>>>>ちょっと,今回のこちらの要件が複雑となっており,
>>>>>>>>>
>>>>>>>>> (1)対象件数が 100件以内 ⇒ そのまま表示
>>>>>>>>> (2)対象件数が 101件以上 かつ 9,999件以内 ⇒ ワーニング①
>>>>>>>>> (3)対象件数が 10,000件以上 ⇒ ワーニング②
>>>>>>>>>
>>>>>>>>> ワーニング①では,取得件数をユーザに通知し,表示を選んだ場合,そのまま取得データを表示
>>>>>>>>> ワーニング②では,取得件数をユーザに通知し,表示を選んだ場合,先頭10,000件のみを表示
>>>>>>>>>
>>>>>>>>>以上のようなことから,ご教示頂いた方式でもできなくともないですが,ワーニング①を実装するときに
>>>>>>>>>正常ケースでgetAllRecordCount()の結果から判定するので,ちょっと無駄なデータを取得し
>>>>>>>>>いるようですね.
>>>>>>>>>
>>>>>>>>>ご提示して頂いた機能は,非常に使い勝手が良さそうなので,本処理向きではありませんが,
>>>>>>>>>追加して頂けるのであれば,大変有難い機能です.
>>>>>>>>>ワーニング①がない処理の方が一般的と思いますし,本システムでも使用することになるかもしれません.
>>>>>>>>>
>>>>>>>>>もし,可能であれば,ご提示機能の検討をお願いしたいです.
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>因みに
>>>>>>>>>>    Integer actualSize = e.getActualResultSize(); // これ必要かな???
>>>>>>>>>は,私にとって,とても必要と思いました.
>>>>>>>>>
>>>>>>>>>以上です.
>>>>>>>>>
>>>>>>>>>>久保(jflute)です。
>>>>>>>>>>
>>>>>>>>>>松原さん、一覧表示の事前件数チェックということですが、
>>>>>>>>>>もし、このような機能があったら要件は満たせますでしょう?
>>>>>>>>>>
>>>>>>>>>>XxxPmb pmb = new XxxPmb();
>>>>>>>>>>pmb.checkSafetyResult(10000); // 一万件超えちゃダメ
>>>>>>>>>>try {
>>>>>>>>>>    xxxBhv.outsideSql().manualPaging().selectPage(...);
>>>>>>>>>>} catch (DangerousResultSizeException e) {
>>>>>>>>>>    int safetySize = e.getSafetyMaxResultSize();
>>>>>>>>>>    Integer actualSize = e.getActualResultSize(); // これ必要かな???
>>>>>>>>>>    // 一万件超えた時の処理
>>>>>>>>>>}
>>>>>>>>>>※無論、実現するなら同様の機能をConditionBeanにも
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>既にConditionBeanでは似たような発想の機能があって、
>>>>>>>>>>それをページングの件数取得にも反映させるのは筋が
>>>>>>>>>>通ってるかなと思いまして。
>>>>>>>>>>
>>>>>>>>>>cb.checkSafetyResult(100);
>>>>>>>>>>xxxBhv.selectList(cb); // 100件超えたら例外
>>>>>>>>>>
>>>>>>>>>>2009/10/20  <[E-MAIL ADDRESS DELETED]>:
>>>>>>>>>>> 久保さま
>>>>>>>>>>>
>>>>>>>>>>> お世話になっております.松原です.
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>>return super.isPaging() && !isCountOnly();
>>>>>>>>>>> ⇒が正解ですね.タイプミスです.
>>>>>>>>>>>
>>>>>>>>>>>>テンプレートの修正が、アップグレード時にロストしないように
>>>>>>>>>>>>DBFluteクライアント配下で管理して、sql2entity.bat(sh)などで、
>>>>>>>>>>>>DBFluteモジュール内に自動的にコピーすることをお奨めします。
>>>>>>>>>>> ⇒その通りですね.こちらの修正したVMファイルは,バッチでコピーするようにします.
>>>>>>>>>>>
>>>>>>>>>>>>ちなみに松原さんの環境では、この件が
>>>>>>>>>>>>(テンプレートを直すまでやるからには)
>>>>>>>>>>>>局所的じゃないってところでしょうか?
>>>>>>>>>>> ⇒今回は外だしSQL(Select句)がデータ構造から多少多くなっていることと,
>>>>>>>>>>> 一覧表示件数の上限があり,事前件数取得が必須となっています.
>>>>>>>>>>> また,今回の件をDBFulteでサポートして頂けると私的には有難いですが,
>>>>>>>>>>> あまり,スタンダードな使用方法ではないと思いますので,久保さまの判断に
>>>>>>>>>>> お任せしたいです.
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> 以上です.大変有難うございました.
>>>>>>>>>>>
>>>>>>>>>>>>久保(jflute)です。
>>>>>>>>>>>>
>>>>>>>>>>>>isPaging()のオーバーライド内の判定ですが、
>>>>>>>>>>>>return super.isPaging() && isCountOnly();
>>>>>>>>>>>>>>>>>>>>>>>>return super.isPaging() && !isCountOnly();
>>>>>>>>>>>>かと(countOnlyじゃなければtrue)
>>>>>>>>>>>>あとテンプレートの修正内容は特に問題なさそうに思えます。
>>>>>>>>>>>>テンプレートの修正が、アップグレード時にロストしないように
>>>>>>>>>>>>DBFluteクライアント配下で管理して、sql2entity.bat(sh)などで、
>>>>>>>>>>>>DBFluteモジュール内に自動的にコピーすることをお奨めします。
>>>>>>>>>>>>
>>>>>>>>>>>>ちなみに松原さんの環境では、この件が
>>>>>>>>>>>>(テンプレートを直すまでやるからには)
>>>>>>>>>>>>局所的じゃないってところでしょうか?
>>>>>>>>>>>>外だしSQLのページング検索のSQLファイルを使って
>>>>>>>>>>>>件数取得だけを単独で実行する業務がたくさんある
>>>>>>>>>>>>ということでしょうか?
>>>>>>>>>>>>(内容によってはやはりDBFlute側でサポートした方がいいかなと)
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>2009/10/20  <[E-MAIL ADDRESS DELETED]>:
>>>>>>>>>>>>> 久保さま
>>>>>>>>>>>>>
>>>>>>>>>>>>> お世話になっております.松原です.
>>>>>>>>>>>>>
>>>>>>>>>>>>> 度々すみません.
>>>>>>>>>>>>>
>>>>>>>>>>>>> 今回の実装を以下のように考えてみなしたが,
>>>>>>>>>>>>> 問題ないでしょうか?
>>>>>>>>>>>>>
>>>>>>>>>>>>> ・DBFluteの自動作成バッチ後に対象クラスの拡張は,再作成のたびに必要となるため,
>>>>>>>>>>>>>  DBFluteの自動作成の中に組み込めないか,以下の「BsParameterBean.vm」に
>>>>>>>>>>>>>  今回の処理を記述してみました.
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> 「BsParameterBean.vm」に「Customize Attribute」と「Customize Accessor」を追加.
>>>>>>>>>>>>>
>>>>>>>>>>>>> ***********************************************************
>>>>>>>>>>>>> ${database.allClassCopyright}package ${glPackageBaseParameterBean};
>>>>>>>>>>>>> #set ($myClassName = "${myBaseParameterBeanClassName}")
>>>>>>>>>>>>>
>>>>>>>>>>>>> #if ($database.isPmbMetaDataForProcedure($pmbClassName))
>>>>>>>>>>>>>
>>>>>>>>>>>>> (省略)
>>>>>>>>>>>>>    // ===================================================================================
>>>>>>>>>>>>>    //                                                                 Customize Attribute
>>>>>>>>>>>>>    //                                                                 ====================
>>>>>>>>>>>>>    protected boolean countOnly;
>>>>>>>>>>>>>
>>>>>>>>>>>>>    // ===================================================================================
>>>>>>>>>>>>>    //                                                                           Attribute
>>>>>>>>>>>>>    //                                                                           =========
>>>>>>>>>>>>>
>>>>>>>>>>>>> (省略)
>>>>>>>>>>>>>
>>>>>>>>>>>>>    // ===================================================================================
>>>>>>>>>>>>>    //                                                                  Customize Accessor
>>>>>>>>>>>>>    //                                                                  ==================
>>>>>>>>>>>>> #if ($database.getPmbMetaDataSuperClassDefinition($pmbClassName).indexOf("SimplePagingBean") > 0)
>>>>>>>>>>>>>    public boolean isCountOnly() {
>>>>>>>>>>>>>        return countOnly;
>>>>>>>>>>>>>    }
>>>>>>>>>>>>>
>>>>>>>>>>>>>    public void setCountOnly(boolean countOnly) {
>>>>>>>>>>>>>        this.countOnly = countOnly;
>>>>>>>>>>>>>    }
>>>>>>>>>>>>>
>>>>>>>>>>>>>    @Override
>>>>>>>>>>>>>    public boolean isPaging() {
>>>>>>>>>>>>>        return super.isPaging() && isCountOnly();
>>>>>>>>>>>>>    }
>>>>>>>>>>>>> #end
>>>>>>>>>>>>>
>>>>>>>>>>>>>    // ===================================================================================
>>>>>>>>>>>>>    //                                                                            Accessor
>>>>>>>>>>>>>    //                                                                            ========
>>>>>>>>>>>>>
>>>>>>>>>>>>> ***********************************************************
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> 見辛くなりましたが,DBFluteの自動作成バッチに組み込む場合,上記内容で問題ないか
>>>>>>>>>>>>> ご教示頂ければ幸いです.
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> 以上です.
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>>久保です。
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>そうですね、現状では、松原さんの考えの通り、
>>>>>>>>>>>>>><B>でisPaging()をオーバーライドするのが良いかと思います。
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>「ページング検索PmbのisPaging()を(再利用のために)falseにする方法」
>>>>>>>>>>>>>>というテーマで、新ドキュメントに反映したいと思います。
>>>>>>>>>>>>>>フィードバックありがとうございました。
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>#
>>>>>>>>>>>>>># pmb.disablePaging()みたいなインターフェースを作って
>>>>>>>>>>>>>># しまおうかとも思いましたが、状況が局所的であることと、
>>>>>>>>>>>>>># よく分かってる人じゃないと理解しづらい機能になるので、
>>>>>>>>>>>>>># やはり、「独自プロパティ&isPaging()をオーバーライド」
>>>>>>>>>>>>>># という方式を正式なものにしようかと思います。
>>>>>>>>>>>>>>#
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>2009/10/20  <[E-MAIL ADDRESS DELETED]>:
>>>>>>>>>>>>>>> 久保さま
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> お世話になっております.松原です.
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> ご返信頂いた内容で全く問題ありません.
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> やはり,現状のDBFluteのParameterBeanでは指定することが
>>>>>>>>>>>>>>> できないですね.
>>>>>>>>>>>>>>> しかも,拡張の仕方までご教示頂けて,大変有難うございます。
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> 現状,こちらで最適とさせて頂いたのは,<B>のisPaging()をオーバーライドして,
>>>>>>>>>>>>>>> 使用する方法がよいと考えております.
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> 説明不足でお手数をお掛けしたこと,申し訳ございませでした.
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> 以上です.貴重な情報を有難うございました.
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>久保(jflute)です。
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>状況わかりました。ありがとうございます。
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>通常の外だしSQLのページング検索用に作成されたSQLを再利用して、
>>>>>>>>>>>>>>>>件数取得だけに絞って実行したいという感じでしょうか。
>>>>>>>>>>>>>>>>(別のSQLにするとWhere句が冗長してしまうので)
>>>>>>>>>>>>>>>>そして、ページング実データが必要になるケースも
>>>>>>>>>>>>>>>>別のプログラムで存在するのですよね???
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>これが前提として:
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>(1) ページングで取得する件数を1件に設定して
>>>>>>>>>>>>>>>>   「outsideSql().autoPaging().selectPage」を呼出す
>>>>>>>>>>>>>>>>だと、不要なページング実データが一件とはいえ取得してしまいます。
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>(2) Select Count(*) のみの外だしSQLを別途作成する
>>>>>>>>>>>>>>>>だと、Where句が冗長してしまいます。
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>><A>
>>>>>>>>>>>>>>>>pmb.xsetPaging(false)で確かにisPaging()がfalseになりますが、
>>>>>>>>>>>>>>>>「x」で始まるメソッドは極力アプリケーションで直接利用して
>>>>>>>>>>>>>>>>欲しくないメソッドではあります。互換性の保証はなく、
>>>>>>>>>>>>>>>>あるときにメソッド名が変わってしまう可能性もあります。
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>なのでそれよりは、以下のように明示的なクラスを作成して、
>>>>>>>>>>>>>>>>利用する方がプログラムの可読性としても良いかなと思います。
>>>>>>>>>>>>>>>>(無名インナークラスでやるとIllegalAccessになってしまいました...)
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>public static class CountOnlyXxxPmb extends XxxPmb {
>>>>>>>>>>>>>>>>    public boolean isPaging() {
>>>>>>>>>>>>>>>>        return false;
>>>>>>>>>>>>>>>>    }
>>>>>>>>>>>>>>>>}
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>><B>
>>>>>>>>>>>>>>>>もう一つは、XxxPmbに新たに[boolean countOnly]というような
>>>>>>>>>>>>>>>>プロパティを追加して、isPaging()と一緒に判定させてあげるように
>>>>>>>>>>>>>>>>するのも良いかと思います。
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>パラメータコメントにてisPaging()と必ず一緒に判定:
>>>>>>>>>>>>>>>>/*IF pmb.isPaging() && !pmb.isCountOnly()*/
>>>>>>>>>>>>>>>>/*END*/
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>もしくは
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>ExParameterBeanでisPaging()をオーバーライドして一緒に判定:
>>>>>>>>>>>>>>>>public class XxxPmb extends BsXxxPmb {
>>>>>>>>>>>>>>>>    public boolean isPaging() {
>>>>>>>>>>>>>>>>        return super.isPaging() && !isCountOnly();
>>>>>>>>>>>>>>>>    }
>>>>>>>>>>>>>>>>}
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>後者の方が単体テストでテストもしやすくタイプセーフですね。
>>>>>>>>>>>>>>>>そして、アプリケーションでの呼び出しにて以下のように:
>>>>>>>>>>>>>>>>XxxPmb pmb = new XxxPmb();
>>>>>>>>>>>>>>>>pmb.setCountOnly(true);
>>>>>>>>>>>>>>>>int count = bhv.outsideSql().entityHandling().selectEntity(...);
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>#
>>>>>>>>>>>>>>>># ポイントなのは、DBFluteも単に2WaySQLの仕組みの
>>>>>>>>>>>>>>>># 範疇で便利な機能を作っているだけってところですね。
>>>>>>>>>>>>>>>># なので、2WaySQLの仕組みを利用することでアレンジ可能です。
>>>>>>>>>>>>>>>>#
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>2009/10/20  <[E-MAIL ADDRESS DELETED]>:
>>>>>>>>>>>>>>>>> 久保さま
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> お世話になっております.松原です.
>>>>>>>>>>>>>>>>> 迅速なご返信,大変ありがとうございます.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> 言葉足らずで申し訳ございません.
>>>>>>>>>>>>>>>>> 以下,本文中に以下インサートで回答させて頂きます.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>久保(jflute)です。
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>松原さん、こんばんは
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>まずは、前提としてこちらのページをご覧下さい。
>>>>>>>>>>>>>>>>>>http://dbflute.sandbox.seasar.org/contents/behavior/paging.html
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>確認させて下さい。
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>><1>
>>>>>>>>>>>>>>>>>>「Paging機能を使用して件数を取得したい」というのは、
>>>>>>>>>>>>>>>>>>「ページングなし件数取得」のことでよろしいでしょうか?
>>>>>>>>>>>>>>>>> ⇒ その通りです.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>><2>
>>>>>>>>>>>>>>>>>>「Paging機能を使用して件数を取得したい」とのことですが、
>>>>>>>>>>>>>>>>>>ページング実データ(例えば、20件目から40件目のレコード)は
>>>>>>>>>>>>>>>>>>不要なのでしょうか?
>>>>>>>>>>>>>>>>> ⇒ 不要です.言葉足らずで申し訳ございません.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>通常の外だしSQLでのページング検索は、
>>>>>>>>>>>>>>>>>>http://dbflute.sandbox.seasar.org/contents/outside-sql/paging.html
>>>>>>>>>>>>>>>>>>このような感じになります。
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>PagingResultBean<UnpaidSummaryMember> page
>>>>>>>>>>>>>>>>>>    = memberBhv.outsideSql().autoPaging().selectPage(path, pmb, entityType);
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>int allRecordCount = page.getAllRecordCount(); // ページングなし件数
>>>>>>>>>>>>>>>>>>for (UnpaidSummaryMember member : page) { // ページング実データ
>>>>>>>>>>>>>>>>>>}
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> ⇒ この場合,結果として件数だけでなくSELECT句の全カラムも取得していると認識していましたが,
>>>>>>>>>>>>>>>>> 以下の「pmb.isPaging()」をfalseとなるように実行すれば、件数のみが取得できると勝手
>>>>>>>>>>>>>>>>> に憶測した次第でした。
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> では、SQLの実行速度及びデータ転送量を最小限に抑えて,外だしSQLの件数取得を行う場合,
>>>>>>>>>>>>>>>>> (1) ページングで取得する件数を1件に設定して「outsideSql().autoPaging().selectPage」
>>>>>>>>>>>>>>>>> を呼出す
>>>>>>>>>>>>>>>>> (2) Select Count(*) のみの外だしSQLを別途作成する
>>>>>>>>>>>>>>>>> の2通りで実装するのが望ましいということでしょうか?
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> また,「ParameterBean#xsetPaging(false);」で一応,件数取得ができているに見えましたが,
>>>>>>>>>>>>>>>>> 使用してはいけないと認識してよろしいでしょうか?
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>  /*IF pmb.isPaging()*/
>>>>>>>>>>>>>>>>>  select member.MEMBER_ID
>>>>>>>>>>>>>>>>>     , member.MEMBER_NAME
>>>>>>>>>>>>>>>>>     , ...
>>>>>>>>>>>>>>>>>  -- ELSE select count(*)
>>>>>>>>>>>>>>>>>  /*END*/
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> 以上です.宜しくお願い致します.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>2009/10/20  <[E-MAIL ADDRESS DELETED]>:
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> お世話になっております.松原です.
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> 掲題の件,実装方法がサイトから見出すことができず,
>>>>>>>>>>>>>>>>>>> 初歩的な質問とは,思いますが,Paging機能を使用して,
>>>>>>>>>>>>>>>>>>> 件数を取得したい場合,以下の使用方法で問題ないか
>>>>>>>>>>>>>>>>>>> ご教示頂けないでしょうか?
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> ===============================================
>>>>>>>>>>>>>>>>>>> <サイトの例>
>>>>>>>>>>>>>>>>>>> /*IF pmb.isPaging()*/
>>>>>>>>>>>>>>>>>>> select member.MEMBER_ID
>>>>>>>>>>>>>>>>>>>     , member.MEMBER_NAME
>>>>>>>>>>>>>>>>>>>     , ...
>>>>>>>>>>>>>>>>>>> -- ELSE select count(*)
>>>>>>>>>>>>>>>>>>> /*END*/
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> <使用時の解釈>
>>>>>>>>>>>>>>>>>>> // Parameterの設定
>>>>>>>>>>>>>>>>>>> final prm = new XxxPmb();
>>>>>>>>>>>>>>>>>>> prm.setName("'テスト'");
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> prm.xsetPaging(false);      // ← (1)このメソッドでPagingをOFF?
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> int cnt = XxxBhv.outsideSql.entityHandling.selectEntity(XxxBhv.PATH_select, prm, Integer.class);
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> System.out.println(cnts);   // ← (2)この結果に件数が入っている?
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> ===============================================
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> (1)と(2)の使い方が正しいか,ご確認の程,宜しくお願いします.
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> 以上.
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> _______________________________________________
>>>>>>>>>>>>>>>>>>> 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 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 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 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 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 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 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 mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-user
>
>


Seasar-user メーリングリストの案内