如何使用JDO查询AppEngine中的单个字段

时间:2011-08-11 02:11:20

标签: google-app-engine jdo

我有一个看起来像的产品POJO。

@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class Product extends AbstractModel {
    @Persistent
    private String name;

    @Persistent
    private Key homePage;

    @Persistent
    private Boolean featured;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Key getHomePage() {
        return homePage;
    }

    public void setHomePage(Key homePage) {
        this.homePage = homePage;
    }

    public boolean isFeatured() {
        return featured;
    }

    public void setFeatured(Boolean featured) {
        this.featured = featured;
    }
}

我的DataStore目前已完全清空。

我想检索产品的特色为true的所有homePage键。

我正在尝试

PersistenceManager persistenceManager = getPersistenceManager();
Query query = persistenceManager.newQuery("SELECT homePage FROM " + getModelClass());
query.setFilter("featured == true");

List<Key> productPageKeys = (List<Key>) query.execute();

然而,这给了我一个空指针错误。我该如何构建此查询?

干杯, 彼得

2 个答案:

答案 0 :(得分:3)

要进行投影,您可以执行类似

的操作
Query q = pm.newQuery("SELECT myField FROM mydomain.MyClass WHERE featured == true");
List<String> results = (List<String>)q.execute();

其中String是我的字段的类型。任何基本的JDO文档都会定义它。 内部GAE / J将检索实体,然后在将其返回给用户之前的后处理中,它被操纵到您需要的投影中。

正如尼克在另一篇回复中所指出的那样,这并没有比自己做的那样没有性能提升......但是标准持久性API的重点是保护你免受这种数据存储特定的必须进行这样的提取;这一切都是开箱即用的。

答案 1 :(得分:0)

实体存储为数据存储区中的序列化数据blob,因此无法从实体检索并返回单个字段。您需要获取整个实体,并提取您自己关心的字段。