ここでは,文書空間オブジェクトの検索について説明します。
文書空間オブジェクトの検索では,検索条件をedmSQL文で指定します。検索結果は検索結果集合として取得します。検索条件の指定方法と検索結果の取得方法については,「4. 検索機能」および「5. edmSQLの文法」を参照してください。
文書空間オブジェクトの検索は,DbjDocSpace#executeSearchメソッドで実行します。検索実行が成功した場合,戻り値として,検索結果集合を扱うDbjResultSetインターフェースが返却されます。
なお,DbjDocSpace#executeSearchメソッドでは,次のような種類の検索が実行できます。
それぞれの検索方法について説明します。
ここでは,edmSQL文だけを指定する単純な検索の例を示します。
// edmSQL文だけを指定する検索の例
// docspc : DbjDocSpaceインターフェース
// 検索実行
DbjResultSet result = docspc.executeSearch(
"SELECT Name FROM DV WHERE Number < 10", // edmSQL文
null, // ?パラメタは指定しない
null );// 検索結果取得情報は指定しない
System.out.println( "result = " + result );
検索を実行すると,検索結果集合を表すオブジェクトが作成されます。この例の場合,検索結果集合は変数resultに返却されます。検索結果を参照する場合は,resultのインターフェースである,DbjResultSetインターフェースを使用します。
ここでは,?パラメタを指定した検索の例を示します。?パラメタは,リストにして,DbjDocSpace#executeSearchメソッドの引数に指定します。?パラメタの値は,パラメタクラスのインターフェースを使用して受け渡します。?パラメタを扱うインターフェースは,DocumentBrokerサーバのデータ型ごとに定義されていますので,データ型に合ったインターフェースを使用してください。
edmSQL文中に複数の?パラメタがある場合,その個数と同じ数の要素を持つ?パラメタのリストを指定します。
// ?パラメタを指定する検索の例
// factory:DbjFactoryインターフェース
// docspc :DbjDocSpaceインターフェース
// ?パラメタに,INT型の値10を指定する
List qparams = new ArrayList();
qparams.add( factory.createInteger32QParam( 10 ));
// 検索実行
DbjResultSet result = docspc.executeSearch(
"SELECT Name FROM DV WHERE Number < ?", // edmSQL文
qparams, // ?パラメタの指定
null ); // 検索結果取得情報は指定しない
System.out.println( "result = " + result );
ここでは,ロック指定検索の例を示します。この検索は,引数にロック種別が指定できる形式のDbjDocSpace#executeSearchメソッドで実行します。ロック種別を指定できない形式を使用した場合や,ロック種別にDbjDef.LOCK_NONEを指定した場合,検索結果として取得した文書空間オブジェクトにロックは設定されません。
// ロック指定検索の例
// docspc : DbjDocSpaceインターフェース
DbjResultSet result = docspc.executeSearch(
"SELECT Name FROM DV WHERE Number < 10", // edmSQL文
null, // ?パラメタは指定しない
null, // 検索結果取得情報は指定しない
DbjDef.LOCK_READ ); // readロックを設定する
ここでは,検索実行時のアクセス制御モードを変更する例を示します。アクセス制御機能に対応した文書空間の場合,デフォルトの設定では,アクセス制御機能付き検索が実行されます。検索結果をアクセス制御しない場合は,アクセス制御モードを変更してください。
アクセス制御モードの変更は,DbjDocSpace#changeSearchACLModeメソッドで実行します。なお,このメソッドは,アクセス制御機能に対応した文書空間以外では実行できません。変更したアクセス制御モードは,次にDbjDocSpace#changeSearchACLModeメソッドを実行するまで有効です。
この例では,アクセス制御モードを変更して,アクセス制御機能なし検索を実行します。
// アクセス制御モードを変更する検索の例
// docspc:DbjDocSpaceインターフェース
// アクセス制御機能を無視する検索モード(アクセス制御機能なし検索)
// に変更する
docspc.changeSearchACLMode( DbjDef.WITHOUT_ACL );
// 検索実行(アクセス制御機能なし検索)
DbjResultSet result = docspc.executeSearch(
"SELECT Name FROM DV WHERE Number < 10", // edmSQL文
null, // ?パラメタは指定しない
null ); // 検索結果取得情報は指定しない
なお,アクセス制御機能付き検索についての詳細は,「4.3.3 アクセス制御機能付き検索」を参照してください。
ここでは,名前付き検索結果を取得する検索の例を示します。この検索は,引数に選択項目のリストが指定できる形式のDbjDocSpace#executeSearchメソッドで実行します。名前付き検索結果および名前なし検索結果については,「4.3.4 名前付き検索結果を取得する検索」を参照してください。
選択項目のリストを指定する引数には,検索結果集合の列に対応する名前をリストで設定します。リストの要素には,列に付ける名前として,SELECT句に指定する選択項目(プロパティ名)を設定します。
なお,名前付き検索結果を取得する場合,edmSQL文のSELECT句は,「$_」と記述してください。「$_」は,検索実行時に,選択項目のリストに指定した項目に置換されます。
// 名前付き検索結果を取得する例1
// docspc : DbjDocSpaceインターフェース
// 列名を指定したリストを作成する
List selectItems = new ArrayList();
selectItems.add("dmaProp_OIID"); // プロパティ名
selectItems.add("S0.Name"); // 相関名.プロパティ名
// 下記のedmSQL文に展開される
// SELECT dmaProp_OIID, S0.Name FROM DV S0 WHERE Number < 10
// 検索結果集合resultの列名は,dmaProp_OIID,S0.Nameとなる
// 検索実行
DbjResultSet result = docspc.executeSearch(
selectItems, // 列名を設定したリスト
"SELECT $_ FROM DV S0 WHERE Number < 10",
// edmSQL文
null, // ?パラメタは指定しない
null ); // 検索結果取得情報は指定しない
System.out.println(
"Column Name[0] is "+ result.getColumnName(0));
System.out.println(
"Column Name[1] is "+ result.getColumnName(1));
名前なし検索結果として取得した検索結果集合に,あとから列名を付けることもできます。名前なし検索結果に対する列名の設定は,DbjResultSet#setColumnMetaNameメソッドで実行します。
また,名前付き検索結果の任意の列から,列名を削除する(列名にnullを設定する)こともできます。ただし,すべての列名を削除しても,名前付き検索結果は名前なし検索結果にはなりません。
次に,名前なし検索結果にあとから列名を設定する例を示します。
// 名前なし検索結果に列名を設定する例
// docspc : DbjDocSpaceインターフェース
// 検索実行
DbjResultSet result = docspc.executeSearch(
"SELECT dmaProp_OIID, S0.Name FROM DV S0 WHERE Number < 10",
// edmSQL文
null, // ?パラメタは指定しない
null ); // 検索結果取得情報は指定しない
// この時点では名前なし検索結果である
// 列名を設定する
result.setColumnMetaName(0, "dmaProp_OIID");//プロパティ名を列名に設定する
// この時点で名前付き検索結果になる
result.setColumnMetaName(1, "S0.Name");// 相関名.プロパティ名を列名に設定する
なお,名前付き検索結果に対して,DbjResultSet#getPropSetメソッドを実行すると,取得するプロパティ値集合のプロパティ名に,検索結果集合の列名がマッピングされます。ただし,列名に相関名またはクラス名が含まれている場合は,列名のうち,プロパティ名の部分だけがプロパティ名としてマッピングされます。
ここでは,検索を実行して取得した検索結果の1行目を,プロパティ値集合として取得する例を示します。
// 名前付き検索結果を取得する例2
// docspc : DbjDocSpaceインターフェース
// 列名を指定したリストを作成する
List selectItems = new ArrayList();
selectItems.add("dmaProp_OIID"); // プロパティ名
selectItems.add("S0.Name"); // 相関名.プロパティ名
// 下記のedmSQL文に展開される
// SELECT dmaProp_OIID, S0.Name FROM DV S0 WHERE Number < 10
// 検索結果集合resultの列名は,dmaProp_OIID, S0.Nameとなる
// 検索実行
DbjResultSet result = docspc.executeSearch(
selectItems, // 列名を指定したリストを指定
"SELECT $_ FROM DV S0 WHERE Number < 10",
// edmSQL文
null, // ?パラメタは指定しない
null ); // 検索結果取得情報は指定しない
// 検索結果集合の列名を出力する
System.out.println(
"Column Name[0] is "+ result.getColumnName(0));
System.out.println(
"Column Name[1] is "+ result.getColumnName(1));
// カーソルを先頭行に移動する
result.next();
// 検索結果集合の1行目をプロパティ値集合として取得する
DbjPropSet props = result.getPropSet();
// propNamesの内容は{"dmaProp_OIID", "Name"}になる
Set propNames = props.keySet();
検索結果集合に複数のDMAクラスの列(文書空間オブジェクトのプロパティ)が含まれる場合は,DbjResultSet#getPropSetメソッドで行のプロパティ値集合を指定する時に,引数に表名(DMAクラス名)が指定できる形式を使用して,特定のDMAクラスのプロパティだけを取得することもできます。例えば,検索結果集合にS0.dmaProp_OIIDとS1.Nameという列が含まれる場合,表名として引数に"S0"を指定して,
props = result.getPropSet("S0");
とすれば,相関名S0で表されるDMAクラスのプロパティであるdmaProp_OIIDだけが取得できます。DMAクラスを指定しない場合は,検索結果集合に含まれるすべてのDMAクラスのプロパティが取得できます。
ここでは,キャッシュ検索の例を示します。キャッシュ検索を実行する場合,キャッシュ名を設定した検索結果取得情報を指定して検索を実行します。検索結果取得情報は,DbjFetchInfoインターフェースで設定します。検索結果取得情報では,キャッシュ名のほか,検索結果の取得開始位置,取得件数,キャッシュの最大件数およびキャッシュキーを設定できます。キャッシュ名を設定していない場合,キャッシュ検索は実行されません。キャッシュ検索の概要については,「4.3.5 検索結果キャッシュと検索結果取得情報を指定した検索」を参照してください。
検索結果キャッシュを使用した検索の例を示します。
// 検索結果キャッシュを使用した検索の例1
// factory : DbjFactoryインターフェース
// docspc : DbjDocSpaceインターフェース
// 検索結果キャッシュを作成して,先頭から100件ずつ検索結果を取得する
// 検索結果取得情報を作成する
// キャッシュ名は"cacheA"とする
DbjFetchInfo fetchinfo = factory.createFetchInfo(
0, // 取得開始位置
100, // 取得件数=100件
-1, // 検索結果キャッシュ取得最大件数(最大)
"cacheA", // キャッシュ名
DbjDef.INITIAL_KEY ); // キャッシュキー
DbjResultSet result = null ;
while ( true ) {
// ループの2回目以降では検索結果キャッシュから検索結果を100件取得する
result = docspc.executeSearch(
"SELECT dmaProp_OIID FROM DV", // edmSQL文
null, // ?パラメタは指定しない
fetchinfo ); // 検索結果取得情報
// 検索結果キャッシュの最終行を取得するまでループする
if ( fetchinfo.getStartIndex()
+ fetchinfo.getFetchCount() >= fetchinfo.getCacheTotal() ) {
break;
}
fetchinfo.setStartIndex(
fetchinfo.getStartIndex() + fetchinfo.getFetchCount() );
// 同じfetchinfoを使用するため,キャッシュキーを再設定する
// 必要はない
}
キャッシュ検索とキャッシュなし検索を組み合わせて使うこともできます。
検索結果キャッシュから取得した検索結果を?パラメタとして指定して,キャッシュなし検索を実行する例を示します。この例では,まず,検索結果としてOIIDを取得するキャッシュ検索を実行します。キャッシュ名は,「search_1」です。次に,「search_1」から検索結果(OIID)を20件ずつ取得しながら,そのOIIDを持つオブジェクトのNameプロパティをキャッシュなし検索によって取得します。
// 検索結果キャッシュを使用した検索の例2
// factory : DbjFactoryインターフェース
// docspc : DbjDocSpaceインターフェース
// 検索取得開始位置を指定する
int startix = 0;
// 取得件数=20件
int fetchcount = 20;
// 検索結果取得情報fetchinfoを作成する
// 取得件数とキャッシュ名は固定で使用するためここで設定する
// 取得開始位置はループ内で設定するため設定しない
DbjFetchInfo fetchinfo = factory.createFetchInfo();
fetchinfo.setFetchCount( fetchcount );
fetchinfo.setCacheName( "search_1" ); // キャッシュ名を指定する
// 検索結果を分割して取得する
while( true ) {
fetchinfo.setStartIndex( startix ); // 取得開始位置を設定する
// キャッシュ検索を実行する
DbjResultSet result = docspc.executeSearch(
"SELECT dmaProp_OIID FROM DV WHERE ...",//edmSQL文
null, // ?パラメタは指定しない
fetchinfo); // 検索結果取得情報
// 検索結果集合resultを表示する
while( result.next() )
{
// 検索結果として取得したOIIDを?パラメタの値に設定する
DbjObj obj = docspc.createObjConnection(
result.getStringVal(0) );
List qparamlst = new ArrayList();
qparamlst.add( factory.createOIIDQParam(obj) );
// キャッシュなし検索を実行する
DbjResultSet result2 = docspc.executeSearch(
"SELECT Name FROM DV WHERE dmaProp_OIID=?",
qparamlst, // ?パラメタ(検索結果として取得したOIID)
null );
result2.next();
Sysmtem.out.println("name="+result2.getStringVal(0));
}
// 開始位置+取得件数がキャッシュ件数以上になったらbreakする
if ( startix + fetchcount >= fetchinfo.getCacheTotal() ) {
break;
}
startix = startix + fetchcount; // 開始位置をインクリメントする
}
なお,検索結果取得情報は,DbjDocSpace#executeSearchメソッド以外に,文書空間オブジェクトの一覧を取得する場合にも使用できます。