题
我目前与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();
}
这将返回所有员工的名称为“泡菜先生”,然后依次通过他们。
不隶属于 StackOverflow