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

kubo [E-MAIL ADDRESS DELETED]
2009年 10月 23日 (金) 14:25:28 JST


久保です。

「build.properties」の方の
「torque.isAvailableHotDeploy = true」は削除しても
構いません。(というか紛らわしいの削除の方が良いです)
「build.properties」の中のプロパティは基本的に
「torque.project」のみとなります。

> (1) ページング指定をParameterBeanに設定していないため,エラーとなる
これは、その通りで想定される例外です。
(メッセージの内容がちょっと古いですね...
fetchPage()とか言ってるので直しておきます)

> (2) ページングを使用しているが,結果がEntity(1件取得)と予定されてしまい,エラーとなる
これは想定外ですね。似たような処理を書いてもこちらでは
今のところ再現していません。スタックとレースをみせて頂いても
よろしいでしょうか?(selectPage()メソッドからのでOKです)
(But the resultCount: 114って何を取得しちゃってるんでしょうね...)

2009/10/23  <[E-MAIL ADDRESS DELETED]>:
> 久保さま
>
>
> お世話になっております.松原です.
>
> 正常に作成できました!!
> 大変有難うございましす.「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 メーリングリストの案内