我在数据存储区中检索多个类的实例时获得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
。关于我可以尝试的任何想法?我做错了吗?
答案 0 :(得分:0)
我刚刚创建了一个示例项目来重现您的问题。 JDO正在保存数据存储区中的实体,但不会根据PersistenceCapable
类的成员变量命名主键属性。检查您的数据存储区查看器并抓取一个随机的Container
实体,看看发生了什么。
如果您需要以这种方式对id属性进行元数据查询,您应该知道ID / Name属性是密钥的一部分。 Check this interesting talk了解有关数据存储区内部如何工作的更多信息(它基于BigTable)。