我目前与Versant对象数据库的工作(使用JVI),并有一个情况下我需要查询基于对象ID的数据库。

问题是我使用磁极位置框架运行的数据库上的一些性能测试,并在该框架内的测试之一要求我使用对象基准或低电平对象ID来从数据库中的对象。因此,我不能引用特定领域的员工对象,但必须完整对象上执行查询。因此,它不允许我去,我需要它使用整个对象“从员工e其中e.id = 4 SELECT *”。

我试图做到的,是沿着

东西线
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 = session.GetObjectId(雇员);

其他提示

这是我做到整个往返对象→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需要。

一般键是整数,并且不是字符串。您正在创建使用只是他的名字,也许是正确的标识符的使用是他的雇员的员工。我需要在桌子上的一些更多的信息,知道。

您可以试试这个,

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

这将返回所有员工的名称为“泡菜先生”,然后依次通过他们。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top