[Seasar-user:6242] Re: [DBFlute]Behavior のPagingについて
kubo
[E-MAIL ADDRESS DELETED]
2007年 2月 20日 (火) 02:00:28 JST
久保です。
米原さんへ
> logから察するに、「レコードが選択されませんでした」となっているよう
です。
> 発行されているSQLをじか打ちしてもやはり「レコードが選択
> されませんでした」となります。「rownum > 100」の指定のために
> 何も選択されないようです。
すいません、調べた結果単刀直入に言いますと
「OracleのfetchPage()」がBugってました。
rownumに関して自分が勘違いしていました。
select *
from (select * from xxx order by xxx)
where rownum <= 10
は正常に動作します。
なので、ConditionBeanのfetchFirst()のみの検索はうまく動作しますが、
select *
from (select * from xxx order by xxx)
where rownum > 10 and rownum <= 20
は必ず0件が帰ってきてしまいます。
正しくは
select *
from (select base.*, rownum as rn
from (select * from xxx order by xxx) base
)
where rn > 10 and rn <= 20
というように書かなければなりません。
Googleで以下のようなキーワードで検索すると同じようなことを
書かれている方がいらっしゃいます。
「OracleではLimit句が使えない」
「ROWNUM を使用した擬似スクロール・カーソル」
手元のにOracleが無いため、動作確認が済んでいない状態で
まことに申し訳御座いませんが、下記のMethodを修正して
試して頂けませんでしょうか?
xxx.allcommon.cbean.sqlclause.SqlClauseOracle の doFetchPage()
protected void doFetchPage() {
if (!isFetchStartIndexSupported() && !isFetchSizeSupported()) {
return;
}
_fetchScopeSelectHint = " * from (select base.*, rownum as rn from (select";
_fetchScopeSqlSuffix = "";
if (isFetchStartIndexSupported()) {
_fetchScopeSqlSuffix = ") base ) where rn > " + getPageStartIndex();
}
if (isFetchSizeSupported()) {
if (isFetchStartIndexSupported()) {
_fetchScopeSqlSuffix = _fetchScopeSqlSuffix + " and rn <= " + getPageEndIndex();
} else {
_fetchScopeSqlSuffix = ") base ) where rn <= " + getPageEndIndex();
}
}
}
> ※※※※※※※※※※※※※※※※※※※※※※※※
> ちなみに以前ご教授頂いた外だしSQLのPAGING
> においては以下のようにSQLを作成して実現しました。
> (良いSQLかわかりませんが・・・)
>
>
> select a.* , a.n from
> (select b.* , rownum n
> from
> (select KYOGAKAISYACD, KYOGAKAISYANAME, JIGYOSYONAME, KYOGASYANAME, NAIYO, TELNO, ICHIRANCD from SMPKYOGATBL
> order by KYOGAKAISYACD
> )b
> )a
> where a.n > 100 and a.n <= 125
こちらの書き方が正しいですね。
DBFluteのドキュメントも直しておきます。
# 自分すっかりOracleから離れて弱者となってしまいました...orz
--
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
kubo <[E-MAIL ADDRESS DELETED]>
jflute <http://d.hatena.ne.jp/jflute>
株式会社ビルドシステム <http://www.buildsystem.co.jp>
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
Seasar-user メーリングリストの案内