Pergunta
Atualmente estou trabalhando com o banco de dados objeto versant (usando JVI), e tem um caso onde eu preciso para consultar o banco de dados com base em uma ID de objeto.
O problema é que eu estou correndo alguns testes de desempenho no banco de dados usando a estrutura da pole position, e um dos testes em que o quadro me obriga a buscar um objeto a partir do banco de dados usando uma referência de objeto ou um ID de objeto de baixo nível . Assim, eu não tenho permissão para fazer referência a campos específicos no objeto empregado, mas deve executar a consulta sobre o objeto em sua totalidade. Assim, não é permitido para mim ir "SELECT * FROM EMPREGADOS E onde e.id = 4", eu preciso dele para usar o objeto inteiro.
O que eu estou tentando alcançar é algo ao longo das linhas de
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();
No entanto, isso gera um erro EVJ_NOT_A_VALID_KEY_TYPE. Alguém sabe a maneira correta de fazer isso?
Solução
Claro que você descobriu isso (post foi há meses). O que você quer fazer é usar o GetObjectId em primeiro lugar, para obter o VOD Id do objeto, em seguida, consulta o banco de dados;
id = session.GetObjectId (empregado);
Outras dicas
Isto é como eu fiz todo o objeto de ida e volta ? OID ? objeto:
Primeiro você começa a OID com TransSession.getOidAsLong
.
TransSession session = ...;
Employee employee = new Employee("Mr. Pickles");
long oid = TransSession.getOidAsLong(employee);
session.commit();
Uma vez que você tem a identificação do objeto, basta pegar o objeto de seu Handle
.
TransSession session = ...;
Employee employee = (Employee)session.returnHandleFromLong(oid).handleToObject();
No VQL necessário.
Normalmente, as chaves são inteiros e não cordas. Você está criando um funcionário usando apenas seu nome, talvez o identificador correto para usar é o seu employeeId. Eu preciso de mais informações sobre a tabela para saber com certeza.
Você pode tentar isso,
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();
}
Ele irá retornar todos os Colaboradores com o nome "Mr. Pickles", laço Então através deles.