2017-09-27 22 views
0

Google Datastore에서 단일 쿼리로 두 개의 .contains를 사용하는 방법. 내 코드 :어떻게 사용합니까 데이터 저장소 쿼리에 두 개 포함

Query query = pm.newQuery("SELECT DISTINCT actualUserEmail FROM packageName :p.contains(actualUserEmail) && :p.contains(OrgUnitPath)"); 

result = (List) query.executeWithArray(Arrays.asList(data),Arrays.asList(test)); 

System.out.println("result ="+result.size()); 

List tempResult = new ArrayList(); 
tempResult.addAll(result); 
return tempResult; 

나는 첫 번째 결과 만 들어 있습니다. 어떻게 내가 두 가지를 사용하는 단일 쿼리에 포함되어 있습니다.

+0

무엇이 쿼리를 실행합니까? 어쩌면 LOG를보세요 ... – DN1

+0

그래서 내 질문으로 돌아가서 대답합니까? 어쩌면 Google의 데이터 저장소가 그런 것을 지원하지 않을 수 있습니까? 또는 아마 Google의 플러그인은 그렇지 않습니다. 아니면 LOG에서 그 질문에 대한 답을 찾을 수 있습니다. 하지만 사실은 당신이 찾아 로그를보고해야합니다 – DN1

답변

0

App Engine Datastore가있는 JDO는 예측할 수없는 행동을합니다. Appengine Datastore API가 더 좋습니다. 여기에 테스트 된 & 데이터 저장소 쿼리에 여러 개의 contains (또는 IN 연산자)가있는 신뢰할 수있는 방법이 있습니다.

DatastoreService datastore = DatastoreServiceFactory.getDatastoreService(); 
     Filter property1Filter = new FilterPredicate("property1", FilterOperator.EQUAL, value1); 
     Filter property2Filter =new FilterPredicate("property2", FilterOperator.IN, valueList1); 
     Filter property3Filter =new FilterPredicate("property3", FilterOperator.IN, valueList2); 
     Filter compositeFilter= CompositeFilterOperator.and(property1Filter, property2Filter); 
     compositeFilterExtended=CompositeFilterOperator.and(compositeFilter, property3Filter); 
     com.google.appengine.api.datastore.Query gaeQuery = new Query("DatastoreKind").setFilter(compositeFilterExtended); 

     PreparedQuery pq = datastore.prepare(gaeQuery); 
     List<Entity> entities = pq.asList(FetchOptions.Builder.withDefaults());  
     return entities; 

희망이 도움이 : 같은

샘플 보일 것 대신 JDO, 나는 그것이 구글 애플리케이션 엔진 데이터 저장소 API를 사용했다.

+0

도와 줘서 고마워요 내가 대답을 가지고있어 –

+0

Akash, 좋았어, 그 변화가 작동해야하지만 여전히, 나는 JDO 연산자/기능 '포함'을 관찰했다 Integer와 같은 숫자가 아닌 문자열 목록에서만 작동하며 App Engine Cloud Datastore가 있습니다. 단일 정수 목록을 사용하더라도 JDO는 App Engine에 대한 쿼리를 실행하지 못합니다. –

0

내가 대답을 한 질문을 & p1 잘 작동합니다.

Query query = pm.newQuery("SELECT DISTINCT actualUserEmail FROM packageName :p.contains(actualUserEmail) && :p1.contains(OrgUnitPath)"); 
result = (List) query.executeWithArray(Arrays.asList(data),Arrays.asList(test)); 

System.out.println("result ="+result.size()); 

List tempResult = new ArrayList(); 
tempResult.addAll(result); 
return tempResult;