문제

현재 Versant Object 데이터베이스 (JVI 사용)와 함께 작업하고 있으며 객체 ID를 기반으로 데이터베이스를 쿼리 해야하는 경우가 있습니다.

문제는 Pole Position Framework를 사용하여 데이터베이스에서 일부 성능 테스트를 실행하고 있으며 해당 프레임 워크의 테스트 중 하나는 객체 참조 또는 낮은 레벨 객체 ID를 사용하여 데이터베이스에서 객체를 가져와야합니다. 따라서 직원 객체에서 특정 필드를 참조 할 수는 없지만 객체의 쿼리를 전체적으로 수행해야합니다. 따라서 "E.ID = 4 인 Employee e에서 선택 *을 선택할 수는 없습니다. 전체 객체를 사용해야합니다.

내가 달성하려는 것은

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를 얻은 다음 db를 쿼리하는 것입니다.

id = session.getObjectid (직원);

다른 팁

이것이 내가 전체 왕복 객체 → OID → 객체를 수행 한 방법입니다.

먼저 당신은 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이 필요하지 않습니다.

일반적으로 키는 정수이며 문자열이 아닙니다. 당신은 그의 이름 만 사용하여 직원을 만들고 있습니다. 아마도 올바른 식별자는 그의 직원 일 것입니다. 테이블에 대한 더 많은 정보가 필요합니다.

당신은 이것을 시도 할 수 있습니다.

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"라는 이름의 모든 직원을 반환 한 다음 그들을 통과합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top