2010-01-07 15 views

답변

2

는 아니 직접적인 대답은,에 의해 getObjectsById에 대한 대안으로, 당신이 사용할 수있는 것 같습니다 JDOQL query to load multiple entities by key :

public List getById(List keys) { 
    Query q = pm.newQuery(
     "select from " + Book.class.getName() + " where :keys.contains(key)"); 
    return (List) q.execute(keys); 
} 

분명히,이 쿼리는 효율적인 낮은 수준의 대량 API를 사용하도록 최적화되어 있습니다.

키의 순서가 손실되기 때문에 Java 토지에서 결과를 다시 정렬해야합니다. 같은

List<Object> ids = new ArrayList<Object>(); 
for (Key key : keys) { 
    ids.add(pm.newObjectIdInstance(Foo.class, key)); 
} 

return (List<Foo>) pm.getObjectsById(ids); 

+0

나는 그것이 작동되도록 할 수없는입니다 : 지원되지 않는 방법 표현을 구문 분석하는 동안 :. InvokeExpression {[ParameterExpression {키}] 포함 (VariableExpression 쿼리에 문제가 <: keys.contains이 (키) 책 SELECT> {key}})} –

3

사용 PersistenceManager.newObjectIdInstance는(), 내가 newObjectIdInstance에 대한 호출은 (그것이 내가 볼 수있는 것과 안)이다 그러나 얼마나 비싼 모르겠어요.

+0

매우 비쌉니다! – Sam

+0

@Sam, 어떤 대안을 찾고 있습니까? Thilo의 솔루션보다 비용이 더 많이 듭니까? 이 전화가 얼마나 비싼 지 어떻게 평가하고 있습니까? – Price

0

위의 답변은 거의 정확합니다.

개발자 웹 사이트에서 Google이 설명하는 구문에 실수가있는 것으로 보입니다.

이 구글에 의해 설명 :

// 나에게 스미스 나 존스 검색어 쿼리 = pm.newQuery에이 lastName 동일한 모든 종업원 부여 (Employee.class, "p.contains (lastName 속성)") ; query.execute (Arrays.asList ("Smith", "Jones")); 확실히

가 있어야한다 :

을 // 나에게 스미스 나 존스 검색어 쿼리 = pm.newQuery (Employee.class, "p.contains (에이 lastName 동일한 모든 종업원 보내기이 lastName) "); query.execute (Arrays.asList ("Smith", "Jones"));

+0

문서가 올바른 것입니다. ": p"가 목록이고 "lastName"이 목록에 포함되어있는 개체가 있는지 확인하고 있으므로 . contains ()입니다. – opowell

관련 문제