ページの先頭行へ戻る
Interstage Shunsaku Data Manager アプリケーション開発ガイド

9.3.2 データの検索

Java APIでは、以下に示す操作ができます。

これらの操作を組み合わせることによって、さまざまなアプリケーションを作成することができます。


参考

ダイレクトアクセスキーを使ったデータ検索も可能です。

ダイレクトアクセスキー機能の詳細については、“第6章 ダイレクトアクセス機能”を参照してください。

データを検索するサンプルプログラムは、“F.1 データの検索”を参照してください。

以降に、データの検索を行うアプリケーションの作成方法について説明します。


9.3.2.1 条件に一致するXML文書の件数を取得する

条件に一致するデータを取り出す前に、件数のみ取得したい場合があります。


このような場合、setRequestメソッドの返信要求件数(requestCount)に0を指定し、件数のみを取得します。


条件に一致するXML文書の件数を取得する場合の流れについて、以下の図に示します。


図9.3 条件に一致するXML文書の件数を取得する場合の流れ


記述例

ShunConnection con = new ShunConnection();

String queryExpression = "/document/base/prefecture == '大阪'";
String returnExpression = "/";
ShunPreparedStatement pstmt = con.prepareSearch(queryExpression, returnExpression); (1)
pstmt.setRequest(1,0);
(2)
ShunResultSet rs = pstmt.executeSearch();
(3)
System.out.println("[ヒット件数] = " + rs.getHitCount());
(4)
rs.close();
(5)
pstmt.close();
(5)

con.close();
(1) ShunPreparedStatementオブジェクトの作成

ShunPreparedStatementオブジェクトは、prepareSearchメソッドのパラメタに検索式とリターン式を指定して作成します。

検索式およびリターン式の詳細は、“付録B 検索式、リターン式およびソート式の書式”を参照してください。


(2) 返信開始番号と返信要求件数の設定

setRequestメソッドに返信開始番号と返信要求件数を指定します。返信要求件数に0を指定して、件数のみ取得します。


(3) 検索の実行(ShunResultSetオブジェクトの作成)

検索の実行はexecuteSearchメソッドを使用します。検索した結果としてShunResultSetオブジェクトが作成されます。


(4) 検索条件に一致するXML文書のヒット件数の取得

getHitCountメソッドで、検索条件に一致するXML文書の件数を取得します。


(5) ShunResultSetオブジェクトおよびShunPreparedStatementオブジェクトの解放

ShunResultSetオブジェクトとShunPreparedStatementオブジェクトは、使用後にそれぞれのcloseメソッドで必ず解放します。


StudioまたはApworks利用時の記述例

以下に、StudioまたはApworksの対話形式のウィザードで作成されたShunsakuアクセスクラスを使ったビジネスクラスの記述例と、ビジネスクラスで使用しているShunsakuアクセスクラスのひな形を示します。


ビジネスクラス

ShunConnection con = new ShunConnection();

ShunsakuAccessController controller = new ShunsakuAccessController(con);
controller.search(key);
int hitCount = controller.getHitCount();
controller.close();

con.close();

ShunPreparedStatementオブジェクト

public class ShunsakuAccessController {
    :
   private ShunPreparedStatement pstmt;
    :
}

Shunsakuアクセスクラスのsearchメソッド

public void search(java.lang.String keys) throws ShunException {
    :
   queryString = "/document/base/prefecture ==  " + keys + "";                               (a)
returnString = "/"; (b)
: getPreparedStatement(queryString, returnString); : } private void getPreparedStatement(String queryString, String returnString) { : pstmt = con.preparedSearch(queryString, returnString); (1)
: }

(a)検索式

対話形式のウィザードで定義します。複雑な検索式も対話形式のウィザードで作成することができます。

(b)リターン式

XML文書全体を取り出す“/”が指定されます。


ShunsakuアクセスクラスのgetHitCountメソッド

public int getHitCount() throws ShunException {
     :
   resultSet = getResultSet(ShunsakuAccessController.SORT_NONE, 1, 0);
     :
   hitCount = resultSet.getHitCount();                                       (4)
: resultSet.close(); (5)
} public ShunResultSet getResultSet(String sortString, int position, int requestCount) throws ShunException { :
   pstmt.setRequest(position, requestCount);                                 (2)
: return pstmt.executeSearch(); (3)
}

Shunsakuアクセスクラスのcloseメソッド

public void close() throws ShunException {
    :
   pstmt.close();                                                     (5)
: }

9.3.2.2 件数に応じて検索した結果を取得する

Webアプリケーションでは、画面にすべての検索結果を表示するのではなく、任意の件数ごとにページを制御することが一般的です。

このような場合、setRequestメソッドに返信開始番号(position)と返信要求件数(requestCount)を指定して、取得するデータの件数を制御します。


件数に応じて検索した結果を取得する場合の流れについて、以下の図に示します。


図9.4 件数に応じて検索した結果を取得する場合の流れ

記述例

ShunConnection con = new ShunConnection();
String queryExpression = "/document/base/prefecture == '大阪'";
String returnExpression = "/document/base/name, /document/base/price";
ShunPreparedStatement pstmt = con.prepareSearch(queryExpression, returnExpression);       (1)
pstmt.setRequest(11,5); (2)
ShunResultSet rs =
pstmt.executeSearch(); (3)
System.out.println("[ヒット件数] = " + rs.getHitCount()); (3)
while(
rs.next()) { (4)
System.out.println("[検索結果] = " + rs.getString()); (4)
}

rs.close(); (5)
pstmt.close(); (5)

con.close();
(1) ShunPreparedStatementオブジェクトの作成

ShunPreparedStatementオブジェクトは、prepareSearchメソッドのパラメタに検索式とリターン式を指定して作成します。

検索式およびリターン式の詳細は、“付録B 検索式、リターン式およびソート式の書式”を参照してください。


(2) 返信開始番号と返信要求件数の設定

setRequestメソッドに返信開始番号と返信要求件数を指定します。setRequestメソッドを省略した場合、返信要求件数はconductor用動作環境ファイルまたはdirector用動作環境ファイルのAnsMaxに設定された値が指定されます。

ポイント

返信要求件数には、1画面に表示する件数を指定します。


(3) 検索の実行(ShunResultSetオブジェクトの作成)

検索の実行はexecuteSearchメソッドを使用します。検索した結果としてShunResultSetオブジェクトが作成されます。

ポイント

検索条件に一致するXML文書のヒット件数は、getHitCountメソッドで取得できます。この値を使用して、検索した結果のページ数などを求めることができます。


(4) 検索した結果の取出し

検索した結果を取り出す前には、必ずnextメソッドを使用します。nextメソッドは、次のデータが存在する場合はtrueを返し、それ以上データがない場合はfalseを返します。


XML文書を取り出すには、目的に応じて以下のメソッドを使用します。使用可能なメソッドについては以下の表を参照してください。

表9.3 XML文書を取り出す場合に使用可能なメソッド一覧

メソッド名

機能説明

getString

XML文書をStringオブジェクトで取り出します。

getStringArray

XML文書をStringオブジェクトの2次元配列で取り出します。

getStream

XML文書をInputStreamオブジェクトで取り出します。

備考.getStringArrayメソッドは、検索した結果をテキスト形式で取り出す場合に有効です。

ポイント

検索した結果とともにデータを一意に識別するレコードIDをgetRecordIDメソッドで取得できます。レコードIDは、対応するXML文書の全体を取り出したり、削除、更新する場合に使用します。


(5) ShunResultSetオブジェクトおよびShunPreparedStatementオブジェクトの解放

ShunResultSetオブジェクトとShunPreparedStatementオブジェクトは、使用後にそれぞれのcloseメソッドで必ず解放します。


StudioまたはApworks利用時の記述例

以下に、StudioまたはApworksの対話形式のウィザードで作成されたShunsakuアクセスクラスを使ったビジネスクラスの記述例と、ビジネスクラスで使用しているShunsakuアクセスクラスのひな形を示します。


ビジネスクラス

ShunConnection con = new ShunConnection();

ShunsakuAccessController controller = new ShunsakuAccessController(con);
controller.search(key);
Object[] resultData = 
      controller.getResultData(ShunsakuAccessController.SORT_NONE, 11, 5);
controller.close();

con.close();

ShunPreparedStatementオブジェクト

public class ShunsakuAccessController {
    :
   private ShunPreparedStatement pstmt;
    :
}

Shunsakuアクセスクラスのsearchメソッド

public void search(String keys) throws ShunException {
    :
   queryString = "/document/base/prefecture ==  " + keys + "";                              (a)
returnString = "/"; (b)
: getPreparedStatement(queryString, returnString); : } private void getPreparedStatement(String queryString, String returnString) { : pstmt = con.preparedSearch(queryString, returnString); (1)
: }

(a)検索式

対話形式のウィザードで定義します。複雑な検索式も対話形式のウィザードで作成することができます。

(b)リターン式

XML文書全体を取り出す“/”が指定されます。


ShunsakuアクセスクラスのgetResultDataメソッド

public Object[] getResultData(String sortString,
                              int position,
                              int requestCount)
                                          throws ShunException {
    :
  ShunResultSet resultSet = getResultSet(sortString, position, requestCount);
    :
  Object[] resultData = parseResultSet(resultSet);                               (4)
    :
  resultSet.close();                                                             (5)
    :
}

public ShunResultSet getResultSet(String sortString,
                                  int position,
                                  int requestCount)
                                  throws ShunException {
  if(!sortString.equals(SORT_NONE)) {
      pstmt.setSort(sortString);
   }
   pstmt.setRequest(position, requestCount);                                     (2)
   return pstmt.executeSearch();                                                 (3)
}

Shunsakuアクセスクラスのcloseメソッド

public void close() throws ShunException {
    :
   pstmt.close();                                                  (5)
: }

9.3.2.3 条件を追加しながら検索した結果を取得する

検索した結果の件数が非常に多いとき、さらに条件を追加して件数を絞りたい場合があります。

このような場合、prepareSerachメソッドに指定する検索式に条件を追加して新しい検索式を作成し、再度検索する処理を行います。この操作を繰り返すことで、画面に表示された検索結果を参照しながら検索結果を絞り込むことができます。


条件を追加しながら検索した結果を取得する場合の流れについて、以下の図に示します。


図9.5 条件を追加しながら検索した結果を取得する場合の流れ


記述例

条件を追加しながら検索した結果を取得する場合の記述例については、“9.3.2.2 件数に応じて検索した結果を取得する”を参照してください。

条件を追加する場合には、prepareSearchメソッドに指定する検索式に条件を追加してください。


StudioまたはApworks利用時の記述例

条件を追加しながら検索した結果を取得する場合のStudioまたはApworks利用時の記述例については、“9.3.2.2 件数に応じて検索した結果を取得する”を参照してください。

条件を追加する場合には、Shunsakuアクセスクラスのsearchメソッドで指定する検索式に条件を追加してください。


9.3.2.4 ヒット件数の上限値を設定する

ヒット件数の上限値を設定することで、ソートまたは集計の応答性能を安定させることができます。ヒット件数が上限値を超えた場合には、ソートまたは集計を中断し検索条件に一致したヒット件数を通知します。

ヒット件数が上限値を超えないように検索式に条件を追加し、ソートまたは集計の検索範囲を絞り込みます。

ヒット件数の上限値を設定するには、setHitCountLimitメソッドを使用します。


ヒット件数の上限値を設定する場合の流れについて、以下の図に示します。


図9.6 ヒット件数の上限値を設定する場合の流れ


記述例

ShunConnection con = new ShunConnection();

String queryExpression = "/document/base/prefecture == '大阪'";
String returnExpression = "/document/base/name, /document/base/price";
String sortExpression = "val(/document/base/price/text()) DESC";
ShunPreparedStatement pstmt = con.prepareSearch(queryExpression, returnExpression);
pstmt.setSort(sortExpression);

/* ヒット件数の上限値を設定 */
pstmt.setHitCountLimit(10000);                                       (1)

ShunResultSet rs = pstmt.executeSearch();

/* ヒット件数が上限値を超えているかの確認 */
if (rs.isHitCountLimitOver() ) {                                     (2)
  System.out.println("ヒット件数が上限値を超えました");
  System.out.println("[ヒット件数] = " + rs.getHitCount());           (3)
}
else {
  System.out.println("[ヒット件数] = " + rs.getHitCount());
  while(rs.next()) {
   System.out.println("[検索結果] = " + rs.getString());
   }
}
rs.close();
pstmt.close();
con.close();

(1) ヒット件数の上限値設定

setHitCountLimitメソッドのパラメタにヒット件数の上限値を設定します。

注意

ソート式が設定されていない場合には、executeSearchメソッド実行時にエラーとなります。


(2) ヒット件数が上限値を超えているの確認

isHitCountLimitOverメソッドでヒット件数が上限値を超えているかの確認をします。


(3) ヒット件数の取出し

ヒット件数が上限値を超えている場合は、ヒット件数のみ取出し可能です。


9.3.2.5 レコードIDの取出し

レコードIDはXML文書全体の取得、データの削除、更新をする場合に使用します。レコードIDの取得はgetRecordIDメソッドを使用します。


レコードIDの取出し方法について、以下の図に示します。


図9.7 レコードIDの取出し方法


記述例

ShunConnection con = new ShunConnection();
String queryExpression = "/document/base/prefecture == '大阪'";
String returnExpression = "/document/base/name, /document/base/price";
ShunPreparedStatement pstmt = con.prepareSearch(queryExpression, returnExpression);      (1)
pstmt.setRequest(11,5); (2)
ShunResultSet rs =
pstmt.executeSearch(); (3)
while(
rs.next()) { (4)
System.out.println("[レコードID] = " + rs.getRecordID());
(4)
}
rs.close(); (5)
pstmt.close(); (5)

con.close();

(1) ShunPreparedStatementオブジェクトの作成

ShunPreparedStatementオブジェクトは、prepareSearchメソッドのパラメタに検索式とリターン式を指定して作成します。

検索式およびリターン式の詳細は、“付録B 検索式、リターン式およびソート式の書式”を参照してください。


(2) 返信開始番号と返信要求件数の設定

setRequestメソッドに返信開始番号と返信要求件数を指定します。setRequestメソッドを省略した場合、返信要求件数はconductor用動作環境ファイルまたはdirector用動作環境ファイルのAnsMaxに設定された値が指定されます。

ポイント

返信要求件数には、1画面に表示する件数を指定します。


(3) 検索の実行(ShunResultSetオブジェクトの作成)

検索の実行はexecuteSearchメソッドを使用します。検索した結果としてShunResultSetオブジェクトが作成されます。


(4) 検索した結果の取出し

検索した結果を取り出すのと同様にレコードIDを取り出す前にも、必ずnextメソッドを使用します。nextメソッドは、次のデータが存在する場合はtrueを返し、それ以上データがない場合はfalseを返します。


(5) ShunResultSetオブジェクトおよびShunPreparedStatementオブジェクトの解放

ShunResultSetオブジェクトとShunPreparedStatementオブジェクトは、使用後にそれぞれのcloseメソッドで必ず解放します。


StudioまたはApworks利用時の記述例

レコードID取出し方法についてビジネスクラスの記述例を以下に示します。Shunsakuアクセスクラスについては、StudioまたはApworksの対話形式のウィザードで作成されたひな形を使用してください。Shunsakuアクセスクラスのひな形については“9.3.2.2 件数に応じて検索した結果を取得する”を参照してください。


ビジネスクラス

ShunConnection con = new ShunConnection();

ShunsakuAccessController controller = new ShunsakuAccessController(con);
controller.search(key);
Object[] resultData = 
   controller.getResultData(ShunsakuAccessController.SORT_NONE, 11, 5);
ShunAddressListModel listData = new ShunAddressListModel(resultData);
dataBean.setResultList(listData);

ListModel resultList = dataBean.getResultList();
for(int i = 0; i < resultList.getSize(); i++) {
   Object result = resultList.getElementAt(i);
   AddressData new_result = (AddressData)result;
   String recordID = new_result.getRecordID();
}

controller.close();
con.close();

9.3.2.6 レコードIDを利用してXML文書全体を取得する

XML文書の中から必要なXML文書を検索する場合、はじめからXML文書の全体を取得するのではなく、XML文書を識別するのに有効な部分情報を取得します。利用者は、これらの部分情報から詳細情報を取得したいXML文書を特定します。

XML文書の全体を取り出すには、部分情報を取り出したときに一緒に返却されるレコードIDを使用します。レコードIDを利用することで目的のXML文書の全体を取り出すことができます。

レコードIDを利用してXML文書全体を取得する場合の流れについて、以下の図に示します。


図9.8 レコードIDを利用してXML文書全体を取得する場合の流れ


記述例

ShunConnection con = new ShunConnection();

ShunPreparedRecordID prid = con.prepareSearchRecordID();            (1)
prid.add(recordID); (2)
ShunResultSet rs =
prid.searchByRecordID(); (3)
while (rs.next()) { (4)
System.out.println("[結果] = " + rs.getString()); (4)
}

rs.close(); (5)
prid.close(); (5)
con.close();

(1) ShunPreparedRecordIDオブジェクトの作成

ShunPreparedRecordIDオブジェクトの作成は、prepareSearchRecordIDメソッドを使用します。


(2) レコードIDの設定

レコードIDの設定は、addメソッドを使用します。レコードIDはgetRecordIDメソッドで取得します。

addメソッドで複数のレコードIDを設定できます。すでに同一のレコードIDが設定されている場合は上書きします。

ポイント

addメソッドで複数のレコードIDを指定することで、一度に複数のXML文書を取得することができます。


(3) 検索の実行(ShunResultSetオブジェクトの作成)

検索の実行はsearchByRecordIDメソッドを使用します。検索した結果としてShunResultSetオブジェクトが作成されます。


(4) 検索した結果の取出し

検索した結果を取り出す前には、必ずnextメソッドを使用します。nextメソッドは、次のデータが存在する場合はtrueを返し、それ以上データがない場合はfalseを返します。


XML文書を取り出すには、目的に応じて以下のメソッドを使用します。使用可能なメソッドについては以下の表を参照してください。


表9.4 XML文書を取り出す場合に使用可能なメソッド一覧

メソッド名

機能説明

getString

XML文書をStringオブジェクトで取り出します。

getStream

XML文書をInputStreamオブジェクトで取り出します。


(5) ShunResultSetオブジェクトおよびShunPreparedRecordIDオブジェクトの解放

ShunResultSetオブジェクトとShunPreparedRecordIDオブジェクトは、使用後にそれぞれのcloseメソッドで必ず解放します。


StudioまたはApworks利用時の記述例

レコードIDを用いてXML文書全体を取り出す方法についてビジネスクラス、Shunsakuアクセスクラスの記述例を以下に示します。


ビジネスクラス

ShunConnection con = new ShunConnection();

ShunsakuAccessController controller = new ShunsakuAccessController(con);
Object[] resultData = controller.detail(recordID);
controller.close();

con.close();

Shunsakuアクセスクラス

public Object[] detail(String recordID) throws ShunException {
   Object[] resultData = null;

   ShunPreparedRecordID prid = con.prepareSearchRecordID();          (1)
prid.add(recordID); (2)
ShunResultSet rs = prid.searchByRecordID(); (3)
try { resultData = paeseResultSet(rs); (4)
} finally { rs.close(); (5)
} prid.close(); (5)
return resultData; }

9.3.2.7 データをソートして取得する

検索した結果をある特定の要素をキーとしてソートして取得したい場合があります。

データの部分情報をソートして取得するには、setSortメソッドを使用します。

データをソートして取得する場合の流れについて、以下の図に示します。


図9.9 データをソートして取得する場合の流れ


ポイント

ソートを行う場合には、検索条件に一致したすべてのXML文書を参照してソート処理を行います。検索式には、結果件数が適正な値となるような条件を指定し、ソート対象のデータを絞ることが応答性能をよくするポイントです。ソートを実施する前に検索条件に一致したXML文書の件数を調べるには、setRequestメソッドの返信要求件数に0を指定します。


記述例

ShunConnection con = new ShunConnection();

String queryExpression = "/document/base/prefecture == '大阪'";
String returnExpression = "/document/base/name, /document/base/price";
String sortExpression = "val(/document/base/price/text()) DESC";                        (1)
ShunPreparedStatement pstmt = con.prepareSearch(queryExpression, returnExpression);     (2)
pstmt.setSort(sortExpression); (3)
ShunResultSet rs =
pstmt.executeSearch(); (4)
while(
rs.next()) { (5)
System.out.println("[検索結果] = " + rs.getString()); (5)
}

rs.close(); (6)
pstmt.close(); (6)
con.close();
(1) ソート式の作成

ソート式を作成します。

ソート式の詳細は、“B.5 ソート式”を参照してください。


(2) ShunPreparedStatementオブジェクトの作成

ShunPreparedStatementオブジェクトの作成は、検索式とリターン式を指定し、prepareSearchメソッドを使用します。

検索式およびリターン式の詳細は、“付録B 検索式、リターン式およびソート式の書式”を参照してください。


(3) ソート式の設定

ソート式の設定は、setSortメソッドを使用します。

注意

ソート式に指定したキーの長さによって返却できる件数が決まります。最大件数は1000件です。返信開始番号や返信要求件数に返却可能な最大件数を超える値を指定しても、それ以上のデータは返却することができません。返却可能なデータの最大件数は、getReturnableCountメソッドで取得できます。

キーの長さと返却可能なデータ件数の目安については、“付録C 定量値”を参照してください。

参考

取得開始位置を指定することにより、続きのデータを取り出すことができます。これにより1000件以上のデータを取り出すことができます。詳細については、“StudioまたはApworks利用時の記述例”を参照してください。


(4) 検索の実行(ShunResultSetオブジェクトの作成)

検索の実行はexecuteSearchメソッドを使用します。検索した結果としてShunResultSetオブジェクトが作成されます。


(5) 検索した結果の取出し

検索した結果を取り出す前には、必ずnextメソッドを使用します。nextメソッドは、次のデータが存在する場合はtrueを返し、それ以上データがない場合はfalseを返します。


XML文書を取り出すには、目的に応じて以下のメソッドを使用します。使用可能なメソッドについては以下の表を参照してください。

表9.5 XML文書を取り出す場合に使用可能なメソッド一覧

メソッド名

機能説明

getString

XML文書をStringオブジェクトで取り出します。

getStringArray

XML文書をStringオブジェクトの2次元配列で取り出します。

getStream

XML文書をInputStreamオブジェクトで取り出します。

備考.getStringArrayメソッドは、検索した結果をテキスト形式で取り出す場合に有効です。

ポイント

検索した結果とともにデータを一意に識別するレコードIDをgetRecordIDメソッドで取得できます。レコードIDは、対応するXML文書の全体を取り出したり、削除したりする場合に使用します。


(6) ShunResultSetオブジェクトおよびShunPreparedStatementオブジェクトの解放

ShunResultSetオブジェクトとShunPreparedStatementオブジェクトは、使用後にそれぞれのcloseメソッドで必ず解放します。


StudioまたはApworks利用時の記述例

以下に、StudioまたはApworksの対話形式のウィザードで作成されたShunsakuアクセスクラスを使ったビジネスクラスの記述例と、ビジネスクラスで使用しているShunsakuアクセスクラスのひな形を示します。


ビジネスクラス

ShunConnection con = new ShunConnection();

ShunsakuAccessController controller = new ShunsakuAccessController(con);
controller.search(key);
Object[] resultData = 
            controller.getResultData(ShunsakuAccessController.SORT_1);
controller.close();

con.close();

ShunPreparedStatementオブジェクト

public class ShunsakuAccessController {
    :
   private ShunPreparedStatement pstmt;
    :
}

Shunsakuアクセスクラスのsearchメソッド

public void search(String keys) throws ShunException {
    :
   queryString = "/document/base/prefecture ==  " + keys + "";                             (a)
returnString = “/”; (b)
: getPreparedStatement(queryString, returnString); : } private void getPreparedStatement(String queryString, String returnString) { : pstmt = con.preparedSearch(queryString, returnString); (2)
: }

(a) 検索式

対話形式のウィザードで定義します。複雑な検索式も対話形式のウィザードで作成することができます。

(b) リターン式

XML文書全体を取り出す“/”が指定されます。


ShunsakuアクセスクラスのgetResultDataメソッド

public Object[] getResultData(String sortString) throws ShunException {
    :
   resultSet = getResultSet(sortString);
    :
   resultData = parseResultSet(resultSet);                                 (5)
: resultSet.close(); (6)
} public ShunResultSet getResultSet(String sortString) throws ShunException { return getResultSet(sortString, 1, Integer.MAX_VALUE); } public ShunResultSet getResultSet(String sortString, int position, int requestCount) throws ShunException { : if(!sortString.equals(SORT_NONE)) { pstmt.setSort(sortString); (3) } : return pstmt.executeSearch(); (4)
: }

ソート式

ソート式は、対話形式のウィザードで作成し、ソート識別子としてShunsakuアクセスクラスの定数として定義されます。

public class ShunsakuAccessController {
    :
   public static final String SORT_NONE = "";                                   (1)
public static final String SORT_1 = "val(/document/base/price/text())"; (1)
: }

Shunsakuアクセスクラスのcloseメソッド

public void close() throws ShunException {
    :
   pstmt.close();                                                    (6)
: }

9.3.2.8 条件に一致するXML文書を連続して取得する

Webアプリケーションでは、検索した結果を一定件数ごとに区切って、前後に連続したデータを取得したい場合があります。


このような場合、setRequestメソッドのパラメタである取得開始位置、または、取得終了位置に、その直前の検索処理によって取得した最終位置情報、または、先頭位置情報を指定してXML文書を連続して取得します。

条件に一致するXML文書を連続して取得する場合の流れについて、以下の図に示します。


図9.10 条件に一致するXML文書を連続して取得する場合の流れ


記述例

String queryExpression = "/document/base/prefecture == '大阪'";
String returnExpression = "/document/base/name, /document/base/price";
String sortExpression = "val(/document/base/price/text()) DESC";

ShunConnection con = new ShunConnection();
ShunPreparedStatement pstmt = con.prepareSearch(queryExpression, returnExpression);
pstmt.setSort(sortExpression);

//取出し方向
int direction = 0;
// 先頭位置情報
String sFirstPos = null;
// 最終位置情報
String sLastPos = null;

// どのページを表示するかによってsetRequestの設定を変更
// 次のページを表示する場合は directionがNEXT、前のページを表示する場合は directionがPREVとする
if(direction == NEXT) {
  // 次のページを表示する場合                                                                      (2)
pstmt.setRequest(sLastPos, 30, pstmt.SHUN_DIRECTION_FORWARD_EXCLUSIVE);

}else if(direction == PREV) {
// 前のページを表示する場合 (3)
pstmt.setRequest(sFirstPos, 30, pstmt.SHUN_DIRECTION_BACKWARD_EXCLUSIVE);

}else{
// 最初のページを表示する場合 (1)
pstmt.setRequest(null, 30, 0);

}
// 検索の実行 (4)
ShunResultSet rs = pstmt.executeSearch();
// 検索した結果の取出し (5)
System.out.println("[ヒット件数] = " + rs.getHitCount());

while(rs.next()) {

System.out.println("[検索結果] = " + rs.getString());

}
// 先頭位置情報と最終位置情報を格納 (6)
sFirstPos = rs.getFirstPosition();
sLastPos = rs.getLastPosition(); // ShunResultSetオブジェクトの解放 (7)
// ShunPreparedStatementオブジェクトの解放

rs.close();

pstmt.close();
con.close();

(1) 最初のページを表示する場合

setRequestメソッドにデータの取得位置と返信要求件数を指定します。 最初のページを表示する検索処理では、最初のデータから取出しを行うため、データの取得位置(取得開始位置または取得終了位置)にはnullを指定します。取得位置にnullを指定すると、1件目からデータを取り出します。


(2) 次のページを表示する場合

setRequestメソッドにデータの取得位置、返信要求件数および取出し方向を指定します。 次のページを表示する検索処理では、前回検索時の最終位置情報をgetLastPositionメソッドで取得しておき、データの取得位置(取得開始位置)に指定します。この指定により前回取得したデータの続きのデータを取得します。


(3) 前のページを表示する場合

setRequestメソッドにデータの取得位置、返信要求件数および取出し方向を指定します。 前のページを表示する検索処理では、前回検索時の先頭位置情報をgetFirstPositionメソッドで取得しておき、データの取得位置(取得終了位置)に指定します。この指定により前回取得したデータの前の部分のデータを取得します。


(4) 検索の実行

executeSearchメソッドで検索を実行します。検索した結果としてShunResultSetオブジェクトが作成されます。


(5) 検索した結果の取出し
  1. 検索した結果を取り出す前には、必ずnextメソッドを使用します。nextメソッドは、次のデータが存在する場合はtrueを返し、それ以上データがない場合はfalseを返します。

  2. XML文書を取り出すために、getStringメソッドを使用します。


(6) 先頭位置情報と最終位置情報を格納
  1. getFirstPositionメソッドを使用して先頭位置情報を格納します。

  2. getLastPositionメソッドを使用して最終位置情報を格納します。


(7) ShunResultSetオブジェクトおよびShunPreparedStatementオブジェクトの解放

ShunResultSetオブジェクトとShunPreparedStatementオブジェクトは、使用後にそれぞれのcloseメソッドで必ず解放します。


StudioまたはApworks利用時の記述例

ビジネスクラス

// 次のページのデータの検索
public void next(DispatchContext context, shunProduct.ShunProductBean dataBean) {
  execute(context, dataBean, ShunAccessController.FORWARD);
 }
// 前のページのデータの検索
 public void back(DispatchContext context, shunProduct.ShunProductBean dataBean) {
  execute(context, dataBean, ShunAccessController.BACKWARD);
 }
// 検索実行 
private void execute(DispatchContext context, shunProduct.ShunProductBean dataBean, int direction)
 {
  String key = dataBean.getKey();
  ShunConnection connection = null;
  ShunsakuAccessController accessController = null;
       :
  //Shunsakuサーバへ接続
   connection = new ShunConnection("localhost", 23101);
   accessController = new ShunsakuAccessController(connection);


   //検索の準備
   accessController.search(key);
   //データの取得位置を取得
   String dataPosition = null;
   if(direction == ShunsakuAccessController.FORWARD)
   {
    dataPosition = dataBean.getLastPosition();
   }
   else if(direction == ShunsakuAccessController.BACKWARD)
   {
    dataPosition = dataBean.getFirstPosition();
   }
   //検索を実行
   Object[] resultData = accessController.getResultData(ShunAccessController.SORT_1, dataPosition, 30, direction);
   int hit = resultData.length;
   //データBeanに、ヒット件数、取得開始位置、取得終了位置を設定
   dataBean.setHitCount(hit);
   dataBean.setFirstPosition(accessController.getFirstPosition());
   dataBean.setLastPosition(accessController.getLastPosition());
   accessController.close();
   connection.close(); 
    :
   //結果データを作成、設定し、次の画面へ遷移
   ShunProductListModel listData = new ShunProductListModel(resultData);
   dataBean.setResultList(listData);
   dataBean.setVerb("output");
   context.setResponseBean("body", dataBean);
   :
}

ソート式

public class ShunsakuAccessController {
    :
   public static final String SORT_NONE = ""l;
   public static final String SORT_1 = "val(/document/base/price/text()) DESC";
    :
}

Shunsakuアクセスクラス

public void search(String keys) throws ShunException {
    :
   queryString = "/document/base/prefecture == '" + keys + "'";
   returnString = "/";
    :
   getPreparedStatement(queryString, returnString);
    :
}

private void getPreparedStatement(String queryString, String returnString)
{
    :
   pstmt = con.preparedSearch(queryString, returnString);
    :
}

 public Object[] getResultData(String sortString, String dataPosition, int requestCount, int direction)throws ShunException 

 {
  ShunResultSet resultSet;
  Object[] resultData = null;
  // 検索の実行
  resultSet = getResultSet(sortString, dataPosition,requestCount,direction);
  this.lastPosition = resultSet.getLastPosition();
  this.firstPosition = resultSet.getFirstPosition();
    :
   resultData = parseResultSet(resultSet);
    :
  return resultData;
 }

 public ShunResultSet getResultSet(String sortString, String dataPosition, int requestCount, int direction)throws ShunException
 {
  ShunResultSet resultSet;
  Object[] resultData = null;

  //ソート式を指定
  if (!sortString.equals(SORT_NON)) {
   this.fPreparedStatement.setSort(sortString);
  }

  //返信要求件数を設定
  this.fPreparedStatement.setRequest(dataPosition, requestCount, direction);

  //検索を実行し、ShunResultSetオブジェクトを作成
  return this.fPreparedStatement.executeSearch();
 }
 public String getFirstPosition()
 {
  return firstPosition;
 }
 public String getLastPosition()
 {
  return lastPosition;
 }

9.3.2.9 条件に一致するデータの内容を集計する

検索した結果をある特定の要素の値で集計して取得したい場合があります。

データの内容を集計するには、setSortメソッドを使用します。prepareSearchメソッドのパラメタであるリターン式に集合関数指定を指定すると、検索した結果が集計されて返却されます。集計処理では、合計値、平均値、最大値、最小値または件数を求めることができます。

条件に一致するデータの内容を集計する場合の流れについて、以下の図に示します。


図9.11 条件に一致するデータの内容を集計する場合の流れ


記述例

ShunConnection con = new ShunConnection();

String queryExpression = "/document/base/prefecture == '大阪'";
String returnExpression = "max(/document/base/price/text())";                            (1)
String sortExpression = "/document/base/prefecture/text()"; (2)
ShunPreparedStatement pstmt = con.prepareSearch(queryExpression, returnExpression); (3)
pstmt.setSort(sortExpression); (4)
ShunResultSet rs =
pstmt.executeSearch(); (5)
while(
rs.next()) { (6)
System.out.println("[検索結果] = " + rs.getString()); (6)
}

rs.close(); (7)
pstmt.close(); (7)
con.close();

(1) リターン式の作成

リターン式を作成します。集計を行う場合は、リターン式に集合関数指定を指定します。

リターン式および集合関数指定の詳細については、“B.4 リターン式”を参照してください。


(2) ソート式の作成

ソート式を作成します。

ソート式の詳細については、“B.5 ソート式”を参照してください。


(3) ShunPreparedStatementオブジェクトの作成

ShunPreparedStatementオブジェクトの作成は、検索式とリターン式を指定し、prepareSearchメソッドを使用します。

検索式およびリターン式の詳細は、“付録B 検索式、リターン式およびソート式の書式”を参照してください。


(4) ソート式の設定

ソート式の設定は、setSortメソッドを使用します。

注意

ソート式に指定したキーの長さによって返却できるグループの数が決まります。最大グループ数は1000グループです。返信開始番号や返信要求件数に返却可能な最大グループ数を超える値を指定しても、それ以上のデータは返却することができません。返却可能なデータの最大件数は、getReturnableCountメソッドで取得できます。

キーの長さと返却可能なグループ数の目安については、“付録C 定量値を参照してください。

参考

取得開始位置を指定することにより、続きのデータを取り出すことができます。これにより1000グループ以上のデータを取り出すことができます。詳細については、“StudioまたはApworks利用時の記述例”を参照してください。


(5) 検索の実行(ShunResultSetオブジェクトの作成)

検索の実行はexecuteSearchメソッドを使用します。検索した結果としてShunResultSetオブジェクトが作成されます。


(6) 検索した結果の取出し

検索した結果を取り出す前には、必ずnextメソッドを使用します。nextメソッドは、次のデータが存在する場合はtrueを返し、それ以上データがない場合はfalseを返します。


XML文書を取り出すには、目的に応じて以下のメソッドを使用します。使用可能なメソッドについては以下の表を参照してください。

表9.6 XML文書を取り出す場合に使用可能なメソッド一覧

メソッド名

機能説明

getString

XML文書をStringオブジェクトで取り出します。

getStringArray

XML文書をStringオブジェクトの2次元配列で取り出します。

getStream

XML文書をInputStreamオブジェクトで取り出します。


(7) ShunResultSetオブジェクトおよびShunPreparedStatementオブジェクトの解放

ShunResultSetオブジェクトとShunPreparedStatementオブジェクトは、使用後にそれぞれのcloseメソッドで必ず解放します。


StudioまたはApworks利用時の記述例

この処理を実現させるためには、自動生成されたShunsakuアクセスクラスのリターン式に集合関数を指定します。以下に、リターン式に集合関数を指定したShunsakuアクセスクラスとビジネスクラスの記述例を示します。


ビジネスクラス

ShunConnection con = new ShunConnection();

ShunsakuAccessController controller = new ShunsakuAccessController(con);
controller.search(key);
ShunResultSet resultData = controller.getResultSet(ShunsakuAccessController.SORT_1);
controller.close();

con.close();

ShunPreparedStatementオブジェクト

public class ShunsakuAccessController {
    :
   private ShunPreparedStatement pstmt;
    :
}

Shunsakuアクセスクラスのsearchメソッド

public void search(String keys) throws ShunException {
    :
   queryString = "/document/base/prefecture ==  " + keys + "";                             (a)
returnString = "max(/document/base/price/text())"; (1)(b)
: getPreparedStatement(queryString, returnString); : } private void getPreparedStatement(String queryString, String returnString) { : pstmt = con.preparedSearch(queryString, returnString); (3)
: }

(a) 検索式

対話形式のウィザードで定義します。複雑な検索式も対話形式のウィザードで作成することができます。

(b) リターン式

集合関数を指定します。


ShunsakuアクセスクラスのgetResultDataメソッド

public ShunResultSet getResultSet(String sortString) throws ShunException {
   return getResultSet(sortString, 1, Integer.MAX_VALUE);
}

public ShunResultSet getResultSet(String sortString,
                                  int position,
                                  int requestCount)
                                  throws ShunException {
    :
  if(!sortString.equals(SORT_NONE)) {
      pstmt.setSort(sortString);                                                (4)
   }
    :
   return pstmt.executeSearch();                                                 (5)
: }

ソート式

ソート式は、対話形式のウィザードで作成し、ソート識別子としてShunsakuアクセスクラスの定数として定義されます。

public class ShunsakuAccessController {
    :
   public static final String SORT_NONE = ""; (2)
public static final String SORT_1 = "val(/document/base/prefecture/text())"; (2)
: }

Shunsakuアクセスクラスのcloseメソッド

public void close() throws ShunException {
    :
   pstmt.close();                                                       (7)
: }