我目前正在使用常用对象数据库(使用jvi),并且我需要根据对象ID查询数据库。
问题是我正在使用极点位置框架对数据库运行一些性能测试,并且该框架中的一个测试要求我使用对象引用或低级对象id从数据库中获取对象。因此,我不允许引用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错误。有谁知道这样做的正确方法?
答案 0 :(得分:5)
当然你想出来了(帖子是几个月前)。你想要做的是首先使用GetObjectId,获取对象的VOD Id,然后查询数据库;
id = session.GetObjectId(employee);
答案 1 :(得分:1)
这就是我完成整个往返对象→OID→对象的方式:
首先,您使用TransSession.getOidAsLong
获得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。
答案 2 :(得分:-1)
通常键是整数而不是字符串。您正在使用他的名字创建一个Employee,也许正确的标识符是他的employeeId。我需要更多信息才能确定。
答案 3 :(得分:-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();
}
它将返回名为“Mr. Pickles”的所有员工,然后循环浏览它们。