コードにおけるビュー・オブジェクト問合せの実行

このトピックでは、問合せを実行するためのビュー・オブジェクトの主なメソッドについて説明します。

また、ビュー・オブジェクトの問合せの例もいくつか紹介します。

executeQueryについて

次のような文により、ビュー・オブジェクトの現行の問合せ文が実行され、(通常は、オンデマンド・フェッチにより)結果のコレクションがリフレッシュされます。

myVO.executeQuery(); 

ビュー・オブジェクトの既存の状態に保留中の変更(挿入、更新、削除)がある場合、それらは基礎となるエンティティのキャッシュに入れられるため、問合せのリフレッシュによる影響を受けません。変更は保留のままで、挿入済の行および更新済の行が現在の保留状態のままビュー・オブジェクト内に表示されます。

executeQueryメソッドでは、変更のポスト、コミットまたは検証は行われません。必要に応じて、postChangesおよびvalidateを明示的にコールします。次に例を示します。

// Pre-validate all changes in this view object
myVO.validate();
// or you can pre-validate all changes in the application module. 
myVO.getApplicationModule().validate();
// Now post all changes 
myVO.getApplicationModule().getTransaction().postChanges();
// Then re-execute the query 
myVO.executeQuery();

この間に他のデータベース・ユーザーが新規の行をデータベースに追加し、それらがビュー・オブジェクトのWHERE条件を満たしていた場合は、それらの行がexecuteQueryのコール後にビュー・オブジェクト内に表示されます。

setWhereClauseのように問合せ句を変更するメソッドでは、問合せは実行されません。問合せ句は、何度でも変更できます。ただし、新規の問合せは、executeQueryをコールするまで実行されません。

次の例では、RowSetから取得されたデータが問合せ句と一致しない可能性があります。

setWhereClause("a = 10")   /* line 1 */
executeQuery()
fetch data /* line 3 */
setWhereClause("a != 10")
fetch more data /* line 5 */

line 5から返された行にはまだa = 10の行があります。line 4の後にexecuteQueryをコールし、a != 10を持つ行を取得します。

次のようにすると、line 6にはb = 11(line 4で設定された保留中の変更済の値)が表示されます。

setWhereClause("a = 10")    /* line 1 */
executeQuery()
retrieve a row /* line 3 */
row.setAttribute("b", 11) /* Say b was equal to 15 in the DB */
executeQuery() /* line 5 */
fetch rows /* line 6 */

これに対し、次の例を検討してみます。ここではWHERE句内の属性が変更されます。

setWhereClause("a = 10")  /* line 1 */
executeQuery()
retrieve a row /* line 3 */
row.setAttribute("a", 11) /* NOTE we're setting "a" this time! */
executeQuery() /* line 5 */
fetch rows /* line 6 */

line 5でexecuteQueryをコールした時点で、line 4での行の変更内容はデータベースにポストされていません。データベースでは、この行はまだa = 10です。データベース・セッションはデータベース内のa = 10を参照するため、line 6で行をフェッチすると、line 3の行が取得されます。ただし、クライアントでは、または内部的には、row.getAttribute("a")に応答して11が返されます。これは、保留されている変更(a=11)がエンティティ・キャッシュにあるためです。

hasNextについて

hasNextメソッドでは、ビュー・オブジェクトの問合せがまだ実行されていない場合、これを実行します。このメソッドは、次のコードSnippetに示すように、結果セットをループする際に便利です。

vo.executeQuery();
while (vo.hasNext()) {
Row row = vo.next(); // Get the next row in the result set.
System.out.println(row.getAttribute(1)); // Do something with the row.
}

ビュー・オブジェクト問合せの例

次のコード例では、設計時にウィザードを使用して作成したビュー・オブジェクト内に定義されている問合せが実行され、結果セットがスクロールされます。結果セットのスクロールはprintViewObject()メソッドで行われます。この例では、汎用アプリケーション・モジュールが使用され、属性にアクセスするためにRow.getAttributeがコールされています。

package d2e;
import oracle.jbo.*;
import javax.naming.Context;
import javax.naming.InitialContext;
import java.util.Hashtable;
public class QueryDemo
{
public static void main(String[] args)
{
// Helper routine connects to the generic application module.
ApplicationModule appMod =
getGenericAppMod(JboContext.PLATFORM_LOCAL);
      // Specify the XML file that defines the view object.
// Format: <package>.<filename>
String voDefFile = "d2e.EmpView";
      // Identify the view object. Must be a valid Java identifier.
String voName = "demoVO";
      // Create the view object within the context defined 
// by the application module.
ViewObject vo = appMod.createViewObjectF(voName, voDefFile);
printViewObject(vo);
vo.remove();
}
   public static ApplicationModule getGenericAppMod(String platform)
{
Hashtable env = new Hashtable(2);
env.put(Context.INITIAL_CONTEXT_FACTORY, JboContext.JBO_CONTEXT_FACTORY);
env.put(JboContext.DEPLOY_PLATFORM, platform);
try
{
Context ic = new InitialContext(env);
String theAMDefName = "d2e.D2eModule";
ApplicationModuleHome home = (ApplicationModuleHome)ic.lookup(theAMDefName);
ApplicationModule appMod = home.create();
appMod.getTransaction().connect("jdbc:oracle:thin:scott/tiger@pc3:1521:ORCL");
return appMod;
}
catch(Exception e)
{
e.printStackTrace();
}
return null;
}
   public static void printViewObject(ViewObject vo)
{
// Execute the query, print results to the screen.
vo.executeQuery();
while (vo.hasNext()) {
Row row = vo.next();
String rowDataStr = "";
         // How many attributes (columns) is the view object using?
int numAttrs = vo.getAttributeCount();
         // Column numbers start with 0, not 1.
for (int columnNo = 0; columnNo < numAttrs; columnNo++) {
           // See also Row.getAttribute(String name).
Object attrData = row.getAttribute(columnNo);
rowDataStr += (attrData + "\t");
}
System.out.println(rowDataStr);
}
}
}