在VQL中查询对象ID

时间:2009-05-29 08:39:55

标签: versant-vod

我目前正在使用常用对象数据库(使用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错误。有谁知道这样做的正确方法?

4 个答案:

答案 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”的所有员工,然后循环浏览它们。