2017-09-27 8 views
0

Comment utiliser deux .contains dans une requête unique dans Google Datastore. mon code:Comment utiliser i contains two dans la requête datastore

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; 

Je reçois seulement le premier contient le résultat. Comment j'utilise deux contient dans une seule requête.

+0

et quelle requête est-ce EXECUTING? comme peut-être regarder le journal ... – DN1

+0

alors revenez à ma question, et y répondre? Peut-être que le datastore de Google ne supporte pas quelque chose comme ça? ou peut-être que le plugin de Google ne fonctionne pas. Ou peut-être dans le LOG, vous trouverez la réponse à cette question. Mais le fait est que vous avez besoin de regarder le LOG pour savoir – DN1

Répondre

0

JDO avec App Engine Datastore se comportent de manière très imprévisible. Appengine Datastore API, est mieux alternatif. Voici un TESTÉ & TRUSTED façon d'avoir plusieurs contient (ou un opérateur IN) dans une requête de banque de données. Au lieu de JDO, je l'ai fait en utilisant Google AppEngine datastore api:

Sample ressemblerait à ceci:

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; 

Hope this helps.

+0

Merci pour l'aide que j'ai eu la réponse –

+0

Akash, Bon, Le changement que vous avez fait, devrait le faire fonctionner mais encore, j'ai observé que JDO opérateur/fonction 'contient' semble fonctionner uniquement avec la liste des chaînes, pas des nombres comme Integer, avec le magasin de données cloud App Engine. Même si vous utilisez une liste unique d'entiers, JDO n'exécute pas la requête pour App Engine. –

0

J'ai eu réponse j'ai fait un changement p & p1 dans la requête fonctionne très bien.

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;