我使用@Embedded和@EmbeddedOnly JDO Annotations将用户定义类(StudentProfile)嵌入到另一个类(Account)中。默认情况下,Google Datastore会对Embedded类的属性进行索引,我想取消嵌入类(StudentProfile)中的许多属性的索引。
我尝试在帐户类中使用'@Extension(vendorName =“datanucleus”,key =“gae.unindexed”,value =“true”)',其中我声明了StudentProfile属性,以及各种属性StudentProfile类本身。即使在此之后,我也能够通过studentAttribute.shortName(我注释为未编入索引的字段)进行过滤。由于Google Datastore文档说未编入索引的字段不能用作过滤器,因此我认为这意味着无索引的工作是徒劳的。
我相信在客观化中有一个@Unindex注释,在JDO中是否存在等价物?
我还尝试在Account类(使用JDO扩展)中对unindexing正常属性进行试验,并且它可以工作(即当我尝试按该属性过滤时返回null)。以下是每个班级的相关代码。任何帮助都非常受到重视!谢谢!
@PersistenceCapable
public class Account {
// primary key and other attributes...
// the embedded class with renaming for the clashing fields
@Persistent(dependent="true", defaultFetchGroup="false")
@Extension(vendorName="datanucleus", key="gae.unindexed", value="true")
@Embedded(members = {
@Persistent(name="shortName", columns=@Column(name="shortName"), extensions=@Extension(vendorName="datanucleus", key="gae.unindexed", value="true")),
@Persistent(name="email", columns=@Column(name="personalEmail")),
@Persistent(name="institute", columns=@Column(name="originalInstitute"))
})
private StudentProfile studentProfile;
}
// the embeddedOnly class
@PersistenceCapable(embeddedOnly="true")
public class StudentProfile {
// other attributes...
// the filter attribute I used for querying
@Persistent
@Extension(vendorName="datanucleus", key="gae.unindexed", value="true")
private String shortName;
}
public StudentProfileAttributes getStudentProfile(String shortName) {
Query q = getPM().newQuery(Account.class);
q.declareParameters("String shortNameParam");
q.setFilter("studentProfile.shortName == shortNameParam");
// the following execution works and a result is returned!
@SuppressWarnings("unchecked")
List<Account> accountsList = (List<Account>) q.execute(shortName);
}
答案 0 :(得分:0)
有一篇博文可以告诉你所有这些事情。 GAE JDO插件的更新版本(2.x)具有@Unindexed(显然不是JDO的一部分,具体是GAE)。 http://gae-java-persistence.blogspot.co.uk/2009/11/unindexed-properties.html