1

現在、(jviを使用して)汎用オブジェクトデータベースを使用していますが、オブジェクトIDに基づいてデータベースをクエリする必要がある場合があります。

問題は、ポールポジションフレームワークを使用してデータベースでいくつかのパフォーマンステストを実行していることです。そのフレームワークのテストの1つでは、オブジェクト参照または低レベルのオブジェクトIDを使用してデータベースからオブジェクトをフェッチする必要があります。したがって、employeeオブジェクトの特定のフィールドを参照することは許可されていませんが、オブジェクト全体に対してクエリを実行する必要があります。したがって、「select * from Employee e where e.id = 4」に進むことは許可されていません。オブジェクト全体を使用するには、これが必要です。

私が達成しようとしているのは、

従業員employee=new Employee( "Mr. Pickles");
session.commit();

FundVQLQuery q = new FundVQLQuery(session、
                 "select * from Employee employee where employee = $ 1");
q.bind(従業員);
q.execute();

ただし、これによりEVJ_NOT_A_VALID_KEY_TYPEエラーがスローされます。誰かがこれを行う正しい方法を知っていますか?

4

4 に答える 4

6

確かにあなたはこれを理解しました(投稿は数ヶ月前でした)。最初にGetObjectIdを使用して、オブジェクトのVOD Idを取得してから、DBにクエリを実行します。

id = session.GetObjectId(employee);

于 2009-11-30T22:38:45.460 に答える
1

これは私がラウンドトリップオブジェクト全体→OID→オブジェクトを行った方法です:

まず、でOIDを取得しますTransSession.getOidAsLong

TransSession session = ...;
Employee employee = new Employee("Mr. Pickles");
long oid = TransSession.getOidAsLong(employee);
session.commit();

オブジェクトIDを取得したら、そのオブジェクトからオブジェクトを取得しますHandle

TransSession session = ...;
Employee employee = (Employee)session.returnHandleFromLong(oid).handleToObject();

VQLは必要ありません。

于 2010-05-17T09:25:43.337 に答える
-1

通常、キーは整数であり、文字列ではありません。名前だけを使用して従業員を作成しています。おそらく、使用する正しい識別子は彼のemployeeIdです。確実に知るために、テーブルに関するもう少し情報が必要です。

于 2009-06-05T19:53:23.667 に答える
-1

あなたはこれを試すことができます、

FundVQLQuery vql = FundVQLQuery (session, 
   "select selfoid from Employee where name = $1"); 
vql.bind ("Mr. Pickles");
HandleEnumeration e = vql.execute (); 
while ( e.hasmoreHandles() ) {
    Handle handle = e.nexthandle(); 
}

「Mr.Pickles」という名前のすべての従業員が返され、ループします。

于 2009-11-25T19:21:51.347 に答える