Запрос идентификатора объекта в VQL
-
06-09-2019 - |
Вопрос
В настоящее время я работаю с базой данных объектов versant (используя jvi), и у меня есть случай, когда мне нужно запросить базу данных на основе идентификатора объекта.
Проблема в том, что я запускаю некоторые тесты производительности базы данных с использованием платформы pole position, и один из тестов в этой платформе требует, чтобы я извлек объект из базы данных, используя либо ссылку на объект, либо идентификатор объекта низкого уровня.Таким образом, мне не разрешено ссылаться на определенные поля в объекте employee, но я должен выполнить запрос к объекту полностью.Итак, мне не разрешено переходить "выбрать * из Employee e, где 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.Кто-нибудь знает правильный способ сделать это?
Решение
Уверен, вы поняли это (сообщение было несколько месяцев назад).Что вы хотите сделать, это сначала использовать GetObjectId, чтобы получить идентификатор VOD объекта, а затем запросить базу данных;
id = сессия.GetObjectId (сотрудник);
Другие советы
Вот как я проделал весь путь туда и обратно object → OID → объект:
Сначала вы получаете OID с помощью TransSession.getOidAsLong
.
TransSession session = ...;
Employee employee = new Employee("Mr. Pickles");
long oid = TransSession.getOidAsLong(employee);
session.commit();
Как только у вас будет идентификатор объекта, просто возьмите объект из его Handle
.
TransSession session = ...;
Employee employee = (Employee)session.returnHandleFromLong(oid).handleToObject();
VQL не требуется.
Обычно ключи представляют собой целые числа, а не строки.Вы создаете Сотрудника, используя только его имя, возможно, правильным идентификатором для использования является его EmployeeID.Мне нужно еще немного информации на столе, чтобы знать наверняка.
Вы можете попробовать это,
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();
}
Это вернет всех Сотрудников с именем "Mr .Соленые огурцы", Затем переберите их петлей.