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

[E-MAIL ADDRESS DELETED] [E-MAIL ADDRESS DELETED]
2009年 10月 23日 (金) 11:26:50 JST


久保さま


 お世話になっております.松原です.

正常に作成できました!!
大変有難うございましす.「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 メーリングリストの案内