1

我目前正在使用 versant 对象数据库(使用 jvi),并且有一种情况需要根据对象 id 查询数据库。

问题是我正在使用杆位框架在数据库上运行一些性能测试,并且该框架中的一项测试要求我使用对象引用或低级对象 ID 从数据库中获取对象。因此,我不允许引用员工对象中的特定字段,但必须对整个对象执行查询。所以,不允许我去“select * from Employee e where e.id = 4”,我需要它来使用整个对象。

我想要达到的目标是

员工employee = new Employee("泡菜先生");
session.commit();

FundVQLQuery q = 新 FundVQLQuery(会话,
                 "select * from Employee employee where employee = $1");
q.bind(员工);
q.execute();

但是,这会引发 EVJ_NOT_A_VALID_KEY_TYPE 错误。有谁知道这样做的正确方法?

4

4 回答 4

6

当然你想通了(帖子是几个月前的)。您要做的是先使用GetObjectId,获取对象的VOD Id,然后查询DB;

id = session.GetObjectId(employee);

于 2009-11-30T22:38:45.460 回答
1

这就是我完成整个往返对象 → OID → 对象的方式:

首先,您使用TransSession.getOidAsLong.

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。

于 2010-05-17T09:25:43.337 回答
-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”的员工,然后遍历它们。

于 2009-11-25T19:21:51.347 回答
-1

通常键是整数而不是字符串。您正在使用他的名字创建一个员工,也许要使用的正确标识符是他的员工 ID。我需要更多关于表格的信息才能确定。

于 2009-06-05T19:53:23.667 回答