Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
はてなダイアリー - akiraメモ
[go: Go Back, main page]

Hatena::Diary
   
はてな
 ようこそゲストさん  最新の日記 ユーザー登録 ログイン ヘルプ

akiraメモ

<前の日 | 次の日>

2004-03-16

[]like検索

select * from item where item_name like #itemName#

こんなselect文をiBATISから発行したかったのだけど

前方一致、とか部分一致のやり方が良く分からなかった。

oracleなら

select * from item where item_name like #itemName# || '%'

で前方一致とかができるようだ。

ただ、そうなるとテスト用DBとして使っているhsqldbでは動かなくなってしまう。

というわけで

select * from item where item_name like concat(#itemName#, '%')

として逃げ。

postgrsql使ったらどうするんだという意見はとりあえず無視。


[]ページング機能

iBATIS1-3-1にはPaginagedListというページング機能専用のListがあった。

これはListを継承したものであり、以下のメソッドが追加されている。

  public int getPageSize();
  public boolean isFirstPage();
  public boolean isMiddlePage();
  public boolean isLastPage();
  public boolean isNextPageAvailable();
  public boolean isPreviousPageAvailable();
  public boolean nextPage();
  public boolean previousPage();
  public void gotoPage(int pageNumber);
  public int getPageIndex();

使い方としては

  //PaginatedList取得。
  PaginatedList list = sqlMap.executeQueryForPaginatedList("getInfo", param, size);

  for (int i = 0; i < list.size(); i++) {
    Info info = (Info) list.get(i);
    //何か処理を行う。
  }

  //....ユーザーが次のページのデータを要求。

  //次のページのデータ取得。
  list.nextPage();

  for (int i = 0; i < list.size(); i++) {
    Info info = (Info) list.get(i);
    //何か処理を行う。
  }

見たいな感じで、listのnextPage()とかpreviousPage()とか呼ぶと

最初にPaginatedListを取得するときに指定したsizeが一ページのサイズとして

次のページとか前のページのデータが取得できる。

WebアプリケーションではこのPaginatedListをセッションなどに入れておき

次のページを表示する必要がればこのPaginatedListのnextPage()メソッドを呼べば

iBATISが内部的にSQL文を発行し次のページの情報を取得して来てくれる。

この機能は確かに優れているけど直接15件目から35件までのデータを取得したい場合には都合がよろしくない。

PaginatedListはインターフェースで実際使われているPaginatedDataListというクラスにはgotoPage(int)メソッドがあり

ページ数移動が可能だがPaginateDataListはコンストラクタで一回SQL文を必ず発行する。

そこからgotoPage(5)とかやって5ページ目のデータを取得するともう一回SQL文が発行される。

それに移動指定もページ指定のみで使い勝手がいいとはいえない。

なんで開始位置、取得件数指定のAPIが無いんだ〜と思って2-0-0-159 beta5を落として調べてみると

  sqlMap.queryForList("getInfo", param, skip, size)

そのものずばりなAPIが追加されていた。

<前の日 | 次の日>