このトピックでは、問合せを実行するためのビュー・オブジェクトの主なメソッドについて説明します。
また、ビュー・オブジェクトの問合せの例もいくつか紹介します。
次のような文により、ビュー・オブジェクトの現行の問合せ文が実行され、(通常は、オンデマンド・フェッチにより)結果のコレクションがリフレッシュされます。
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
メソッドでは、ビュー・オブジェクトの問合せがまだ実行されていない場合、これを実行します。このメソッドは、次のコード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);
}
}
}