Question

Je travaille actuellement avec la base de données objet Versant (en utilisant IMV), et un cas où je dois interroger la base de données basée sur un identifiant d'objet.

Le problème est que je suis en cours d'exécution des tests de performance sur la base de données en utilisant le cadre de la pole position, et l'un des tests dans ce cadre me demande d'aller chercher un objet à partir de la base de données en utilisant une référence d'objet ou d'un ID d'objet bas niveau . Ainsi, je ne suis pas autorisé à faire référence à des domaines spécifiques dans l'objet employé, mais doit effectuer la requête sur l'objet dans son intégralité. Donc, ce n'est pas permis pour moi d'aller « select * from employé e où e.id = 4 », je besoin d'utiliser l'objet entier.

Ce que je suis en train de réaliser est quelque chose le long des lignes 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();

Cependant, cela jette une erreur de EVJ_NOT_A_VALID_KEY_TYPE. Est-ce que quelqu'un sait la bonne façon de le faire?

Était-ce utile?

La solution

Bien sûr, vous compris cela (après il y a été mois). Ce que vous voulez faire est d'utiliser la GetObjectId d'abord, pour obtenir l'ID VOD de l'objet, puis interroger la base de données;

id = session.GetObjectId (employé);

Autres conseils

Voici comment je l'ai fait tout l'objet aller-retour → OID → objet:

D'abord, vous obtenez l'OID avec TransSession.getOidAsLong.

TransSession session = ...;
Employee employee = new Employee("Mr. Pickles");
long oid = TransSession.getOidAsLong(employee);
session.commit();

Une fois que vous avez l'ID d'objet, saisir tout l'objet de son Handle.

TransSession session = ...;
Employee employee = (Employee)session.returnHandleFromLong(oid).handleToObject();

Non VQL nécessaire.

En général, les clés sont des nombres entiers et non des chaînes. Vous créez un employé en utilisant simplement son nom, peut-être l'identifiant à utiliser est son employeeId. J'ai besoin de plus d'informations sur la table pour en être sûr.

Vous pouvez essayer,

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

Il retournera tous les employés avec le nom « M. Pickles », puis boucle à travers eux.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top