如何检索数据存储区中属性的表示元数据?

时间:2014-12-27 00:14:03

标签: google-app-engine google-cloud-datastore

我在数据存储区中检索多个类的实例时获得ClassCastException (java.lang.Double cannot be cast to java.lang.Long)。该类有许多值是双倍的,很多是长的。我想查看数据存储区中的内容并与类属性进行比较,以查看是否存在不匹配。我尝试了https://cloud.google.com/appengine/docs/java/datastore/metadataqueries#Java_Kind_queries底部附近的representationsOfProperty方法,但我的查询返回null

我有一个类似于以下内容的类:

@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class Container
{
    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Long    containerID         = null;

    @Persistent
    private Long    extensionID     = null;

    @Persistent
    private String  homeUrl;

    @Persistent
    private Double containerScore;
}

我从上面链接的GAE页面复制了代码。我做的唯一改变是转换' '到" "因为请求了一个字符串,并且示例中显示的内容不是一个字符。

Collection<String> representationsOfProperty(DatastoreService ds,
        String kind,
        String property) 
{

    // Start with unrestricted non-keys-only property query
    Query q = new Query(Entities.PROPERTY_METADATA_KIND);

    // Limit to specified kind and property
    q.setFilter(new FilterPredicate("__key__",  Query.FilterOperator.EQUAL, Entities.createPropertyKey(kind, property)));

    // Get query result
    PreparedQuery pq = ds.prepare(q);
    Entity propInfo = pq.asSingleEntity();

    if( null == propInfo )
    {
        Collection<String> strs = new ArrayList<String>();
        strs.add( "[ERROR: Invalid Query: " + pq.toString() + "]" );
        return strs;
    }

    // Return collection of property representations
    return (Collection<String>) propInfo.getProperty("property_representation");
}

我用以下代码调用该方法:

DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
String prop = "containerID";
Collection<String> reps = representationsOfProperty( datastore, Container.class.toString(), prop );

不幸的是,propInfo始终是null。关于我可以尝试的任何想法?我做错了吗?

1 个答案:

答案 0 :(得分:0)

我刚刚创建了一个示例项目来重现您的问题。 JDO正在保存数据存储区中的实体,但不会根据PersistenceCapable类的成员变量命名主键属性。检查您的数据存储区查看器并抓取一个随机的Container实体,看看发生了什么。

如果您需要以这种方式对id属性进行元数据查询,您应该知道ID / Name属性是密钥的一部分。 Check this interesting talk了解有关数据存储区内部如何工作的更多信息(它基于BigTable)。