質問

私は現在、(jviを使用して)versantオブジェクトデータベースでの作業、そして私は、オブジェクトIDに基づいてデータベースを照会する必要がある場合がありますよ。

の問題は、私は、磁極位置のフレームワークを使用してデータベースにいくつかのパフォーマンステストを実行していて、そのフレームワークにおける試験の一つは、オブジェクト参照または低レベルのオブジェクトIDのいずれかを使用して、データベースからオブジェクトをフェッチするために私を必要とします。したがって、私は、従業員オブジェクト内の特定のフィールドを参照することができないんだけど、その全体を対象にクエリを実行する必要があります。だから、それは、私はそれが全体のオブジェクトを使用する必要がある「e.id = 4従業員のeから*を選択して」行くことを私のために許可されていません。

タグの線に沿って何か私は何を達成しようとしているあります
Employee employee = new Employee("Mr. Pickles");
session.commit();

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

しかし、これはEVJ_NOT_A_VALID_KEY_TYPEエラーがスローされます。誰もがこれを行うための正しい方法を知っていますか?

役に立ちましたか?

解決

確かに、あなたは(ポストは数ヶ月前だった)、これを考え出しました。何がやりたいことは、その後DBを照会し、オブジェクトのVOD IDを取得するために、最初のGetObjectIdを使用しています。

ID = session.GetObjectId(従業員);

他のヒント

これは、私は全体の往復のオブジェクトをやった方法です→OIDオブジェクト→ます:

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

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必要。

通常のキーは、整数ではなく文字列です。あなたは、おそらく使用する正しい識別子が彼の社員で、ちょうど彼の名前を使用して従業員を作成しています。私は確かに知っているテーブルの上にいくつかのより多くの情報が必要。

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

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(); 
}

これは、それらをループし、名前に「ミスターピクルス」を全従業員を返します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top