質問
私は現在、(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();
}
これは、それらをループし、名前に「ミスターピクルス」を全従業員を返します。