查询整型字段的 GAE 数据存储



我在查询 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,因为它很方便。

本地开发服务器和部署到 GAE 时会出现相同的问题。

好的,

我发现了发生了什么。"问题"在于,由于某种原因,BeanUtils将整数转换为字符串。字符串在数据存储查看器中看起来完全相同,但当然也不相同。这几乎愚弄了我。我应该研究一下apache BeanUtils手册或其他东西。

在查询数据之前,您是否在写入后 1 秒为数据存储提供了条件?有时你不必这样做(也许是祖先查询),但其他时候你会这样做。GAE/J 文档将提供完整的详细信息。

实体是用BeanUtils创建的,这一事实完全无关紧要。 如果实体位于数据存储中(您可以在查看器中看到它们)并且字段值已编制索引(它在数据存储查看器中的值旁边不显示"未编制索引"),则可以使用筛选器查询它们。 这行得通...它是数据存储的基本功能。

鉴于实体是创建和索引的,我建议伊恩·马歇尔的建议可能是正确的。 要对此进行测试,请转到 App Engine 的首选项,然后取消选中"启用本地 HRD 支持"。 这将确保在编写实体时可以立即查询它。

存储整数或整数或任何其他数值并不重要 - 它们都在内部存储为长整型值,当您读回值时,您将获得一个 Long(尽管存储了一个整数)

最新更新