2

GAE データストアにクエリを実行すると、奇妙な動作に気付きます。特定の状況下で、フィルターは整数フィールドに対して機能しません。次の Java コードは、問題を再現します。

log.info("start experiment");

DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();

int val = 777;

// create and store the first entity.
Entity testEntity1 = new Entity(KeyFactory.createKey("Test", "entity1"));
Object value = new Integer(val);
testEntity1.setProperty("field", value);
datastore.put(testEntity1);

// create the second entity by using BeanUtils.
Test test2 = new Test(); // just a regular bean with an int field
test2.setField(val);

Entity testEntity2 = new Entity(KeyFactory.createKey("Test", "entity2"));

Map<String, Object> description = BeanUtilsBean.getInstance().describe(test2);
for(Entry<String,Object> entry:description.entrySet()){
    testEntity2.setProperty(entry.getKey(), entry.getValue());
}

datastore.put(testEntity2);


// now try to retrieve the entities from the database...

Filter equalFilter = new FilterPredicate("field", FilterOperator.EQUAL, val);

Query q = new Query("Test").setFilter(equalFilter);

Iterator<Entity> iter = datastore.prepare(q).asIterator();

while (iter.hasNext()) {
    log.info("found entity: " + iter.next().getKey());
}

log.info("experiment finished");

ログは次のようになります。

INFO: start experiment
INFO: found entity: Test("entity1")
INFO: experiment finished

何らかの理由で、両方のエンティティが実際にはデータストアに格納されており、両方の「フィールド」値が 777 であるにもかかわらず、最初のエンティティしか検出されません (データストア ビューアーに表示されます)。エンティティの作成方法が重要なのはなぜですか? BeanUtils は便利なので使いたいです。

同じ問題が、ローカル devserver と GAE にデプロイされたときに発生します。

4

3 に答える 3

2

何が起こっているのかわかりました。「問題」は、何らかの理由で BeanUtils が整数を文字列に変換することです。文字列はデータストア ビューアではまったく同じに見えますが、もちろん同じではありません。これはかなりだまされました。apache BeanUtils マニュアルか何かを勉強する必要がありました。

于 2012-12-13T16:56:19.163 に答える
0

データをクエリする前に、書き込み後 1 秒間データストアに与えましたか? 必要がない場合もありますが (祖先のクエリなど)、必要な場合もあります。詳細については、GAE/J のドキュメントを参照してください。

于 2012-12-13T10:04:14.517 に答える