【问题标题】:Query on object id in VQL在 VQL 中查询对象 id
【发布时间】:2009-05-29 08:39:54
【问题描述】:

我目前正在使用 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 错误。有谁知道这样做的正确方法吗?

【问题讨论】:

  • 你发现了哪些困难的事情?这是 Java 还是 C++?
  • 这是java。我发现我试图实现这一目标的方式是错误的,因为我得到了一个 EVJ_NOT_A_VALID_KEY_TYPE,这意味着我无法将参数绑定到类型为雇员的对象。

标签: versant-vod


【解决方案1】:

您肯定知道这一点(帖子是几个月前的)。您要做的是先使用GetObjectId,获取对象的VOD Id,然后查询DB;

id = session.GetObjectId(employee);

【讨论】:

  • 其实我一直没弄明白,谢谢!问题在于:meta.stackexchange.com/questions/1413/… 我无法将您的答案标记为已接受,坦率地说这很愚蠢。不过,我非常感谢您花时间回答这个问题。但是,该线程的所有读者都应该知道这是这个问题的答案。你摇滚!
【解决方案2】:

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

【讨论】:

  • 我一直在努力通过 oid 获取对象,所以你的最后一个例子让我很开心 - 谢谢!
【解决方案3】:

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

【讨论】:

  • 嗨,迈克,感谢您的回答。问题是我正在使用杆位框架在数据库上运行一些性能测试,并且该框架中的一项测试要求我使用对象引用或低级对象 ID 从数据库中获取对象。因此,我不允许引用员工对象中的特定字段,但必须对整个对象执行查询。所以,不允许我去“select * from Employee e where e.id = 4”,我需要它来使用整个对象。
  • 但您仍然需要至少填充关键字段。如果关键字段是 EmployeeID,则需要在对象中填充它才能工作。仔细检查员工表上的主键是什么。
  • 它是一个对象数据库,所以键真的不是必需的。
【解决方案4】:

你可以试试这个,

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”的员工,然后循环遍历它们。

【讨论】:

  • 谢谢伯尼,但不幸的是,我不得不将查询绑定到对象 ID,而不是对象属性。
猜你喜欢
  • 2017-03-28
  • 1970-01-01
  • 1970-01-01
  • 2016-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
相关资源
最近更新 更多