代码之家  ›  专栏  ›  技术社区  ›  Mia Clarke

VQL中的对象ID查询

  •  0
  • Mia Clarke  · 技术社区  · 17 年前

    我目前正在使用Versant对象数据库(使用jvi),并且有一个案例需要基于对象ID查询数据库。

    问题是我正在使用极位置框架对数据库运行一些性能测试,该框架中的一个测试要求我使用对象引用或低级对象ID从数据库中获取对象。因此,不允许我引用Employee对象中的特定字段,但必须执行查询。在整个对象上。所以,不允许我去“从员工e中选择*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_类型错误。有人知道正确的方法吗?

    4 回复  |  直到 14 年前
        1
  •  5
  •   Chris Holmes    16 年前

    当然你知道了(几个月前的帖子)。您要做的是首先使用get object id,获取对象的VOD ID,然后查询db;

    id=session.getObjectId(员工);

        2
  •  1
  •   gustafc    16 年前

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

        3
  •  -1
  •   Mike Pone    17 年前

    通常键是整数而不是字符串。您只使用员工的姓名创建员工,可能要使用的正确标识符是员工ID。我需要更多的信息来确定。

        4
  •  -1
  •   Bernie Perez    16 年前

    你可以试试这个,

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

    它将返回所有名为“pickles先生”的员工,然后循环访问他们。

    推荐文章