2009-05-29 9 views
0

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

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

私は何を達成しようとしていること

 
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エラーがスローされます。誰もがこれを行う正しい方法を知っていますか?

+0

あなたはどんな種類のことを見つけ出していますか?これはJavaかC++ですか? – John

+0

これはJavaです。私はEVJ_NOT_A_VALID_KEY_TYPEを取得するので、これを達成しようとしている方法が間違っているという難しい方法を見つけ出しています。これは、そのタイプの従業員のオブジェクトにパラメータをバインドできないことを意味します。 –

答えて

5

確かにこれを理解しました(投稿は数か月前でした)。あなたがしたいのは、最初にGetObjectIdを使って、オブジェクトのVOD Idを取得し、DBに問い合わせることです。

id = session.GetObjectId(従業員);あなたはTransSession.getOidAsLongでOIDを取得

まず:

+0

実際、私はそれを理解したことがないので、ありがとう!問題はこのためです:http://meta.stackexchange.com/questions/1413/why-an-answer-cant-be-accepted-after-an-unresolved-bounty私はあなたの答えを受け入れたものとしてマークすることはできませんが、率直に言って愚かです。私は、これに答える時間を取ってくれたことに感謝します。しかし、このスレッドのすべての読者は、これがこの質問に対する答えであることを知るべきです。あなたはロック! –

+0

クール、ありがとう!嬉しいことに:-) –

-1

通常、キーは文字列ではなく整数です。自分の名前だけを使用して従業員を作成しています。使用する正しい識別子はemployeeIdです。私は確かに知るためにテーブル上のいくつかのより多くの情報が必要です。

+0

こんにちはマイク、あなたの答えをありがとう。問題は、ポールポジションフレームワークを使用してデータベースのパフォーマンステストを実行していることです。そのフレームワークのテストの1つでは、オブジェクト参照または低レベルオブジェクトIDのいずれかを使用してデータベースからオブジェクトをフェッチする必要があります。したがって、従業員オブジェクト内の特定のフィールドを参照することはできませんが、そのオブジェクト全体のクエリを実行する必要があります。だから、私が "select * from Employee e where e.id = 4"に行くことは許されません。オブジェクト全体を使う必要があります。 –

+0

しかし、あなたはまだ少なくともキーフィールドに値を設定する必要があります。キーフィールドがEmployeeIDの場合は、これを機能させるにはオブジェクトに値を設定する必要があります。従業員表の主キーが何であるかを再確認してください。 –

+0

これはオブジェクトデータベースなので、キーは本当に必要ではありません。 –

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

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

+0

Bernieありがとうございますが、不幸にも、オブジェクトのプロパティではなく、オブジェクトIDにクエリをバインドする必要があるという制約がありました。 –

+0

なぜ格付けが下がったのですか? Grr .... –

1

これは私が全体の往復のオブジェクト→ 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は必要ありません。

+0

私はオブジェクトをoidで取得するのに苦労していたので、最後の例が私の日でした - ありがとう! – bobtheowl2

関連する問題