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

Google app engine 如何检索数据存储中属性的表示元数据?,google-app-engine,google-cloud-datastore,Google App Engine,Google Cloud Datastore,在数据存储中检索一个类的多个实例时,我得到了一个ClassCastException(java.lang.Double不能转换为java.lang.Long)。该类有许多双精度值和长精度值。我想查看数据存储中的内容,并与类属性进行比较,以查看是否存在不匹配。我尝试了在的底部附近找到的representationsOfProperty方法,但我的查询返回null 我定义了一个类似于以下内容的类: @PersistenceCapable(identityType = IdentityType.APP

在数据存储中检索一个类的多个实例时,我得到了一个
ClassCastException(java.lang.Double不能转换为java.lang.Long)
。该类有许多双精度值和长精度值。我想查看数据存储中的内容,并与类属性进行比较,以查看是否存在不匹配。我尝试了在的底部附近找到的
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");
}
属性的集合表示(数据存储服务ds、,
弦类,
字符串属性)
{
//从不受限制的非仅键属性查询开始
查询q=新查询(Entities.PROPERTY\u METADATA\u KIND);
//限制到指定的种类和属性
q、 setFilter(新的FilterPredicate(“\uuuuu key\uuuuuuu”,Query.FilterOperator.EQUAL,Entities.createPropertyKey(种类,属性)));
//获取查询结果
PreparedQuery pq=ds.prepare(q);
实体propInfo=pq.asSingleEntity();
if(null==propInfo)
{
Collection strs=new ArrayList();
添加(“[错误:无效查询:“+pq.toString()+”]”);
返回STR;
}
//返回属性表示的集合
返回(收集)propInfo.getProperty(“property_表示”);
}
我使用以下代码调用该方法:

DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
String prop = "containerID";
Collection<String> reps = representationsOfProperty( datastore, Container.class.toString(), prop );
DatastoreService datastore=DatastoreServiceFactory.getDatastoreService();
String prop=“containerID”;
Collection reps=representationsOfProperty(数据存储,Container.class.toString(),prop);

不幸的是,
propInfo
总是
null
。我能试试什么吗?我做错什么了吗?

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


如果需要以这种方式对id属性执行元数据查询,那么应该知道id/Name属性是键的一部分。要了解更多关于数据存储内部如何工作的信息(它基于BigTable)。

由于使用JDO持久化数据并使用低级API检索数据,您可能会遇到问题。请参阅如何在JDO中进行查询。我只是尝试解决一个单独的问题,在这个问题中,我可以一次检索一个类,但不能在一个查询中检索多个类。该代码以前工作过,但在更新后中断。我希望查看元数据并查看字段的存储类型。谢谢。我应该像以前注意到的那样考虑这个问题。对于我的普通JDO查询,我不必弄乱名称,并且已经习惯了在每个查询中使用字段名。