Domanda
Al momento sto lavorando con il database degli oggetti versante (usando JVI), e hanno un caso in cui ho bisogno di interrogare il database in base a un id oggetto.
Il problema è che sto correndo alcuni test di performance sul database utilizzando il framework pole position, e uno dei test in tale contesto mi obbliga a prendere un oggetto dal database utilizzando un riferimento a un oggetto o un oggetto di id basso livello . Quindi, io non sono autorizzato a fare riferimento ai campi specifici nell'oggetto dipendente, ma deve eseguire la query sull'oggetto nella sua interezza. Quindi, non è permesso a me di andare "select * from Employee e dove e.id = 4", ho bisogno di usare l'intero oggetto.
Quello che sto cercando di realizzare è qualcosa sulla falsariga di
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();
Tuttavia, questo genera un errore EVJ_NOT_A_VALID_KEY_TYPE. Qualcuno sa il modo corretto di fare questo?
Soluzione
Certo si capito questo (messaggio è stato mesi fa). Che cosa si vuole fare è utilizzare il GetObjectId prima, per ottenere il VOD Id dell'oggetto, quindi interrogare il DB;
id = session.GetObjectId (dipendente);
Altri suggerimenti
Questo è come ho fatto l'intero oggetto di andata e ritorno → → OID oggetto:
In primo luogo si ottiene l'OID con TransSession.getOidAsLong
.
TransSession session = ...;
Employee employee = new Employee("Mr. Pickles");
long oid = TransSession.getOidAsLong(employee);
session.commit();
Una volta ottenuto l'ID oggetto, basta afferrare l'oggetto dalla sua Handle
.
TransSession session = ...;
Employee employee = (Employee)session.returnHandleFromLong(oid).handleToObject();
Non VQL necessario.
Di solito le chiavi sono numeri interi e non stringhe. Si sta creando un dipendente che usa solo il suo nome, forse il corretto identificativo per l'uso è il suo employeeId. Ho bisogno di qualche informazione in più sul tavolo per sapere con certezza.
Si può provare questo,
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();
}
Si restituirà tutti i dipendenti con il nome "Mr. Pickles", quindi ciclo attraverso di loro.