【问题标题】:How do I query a single field in AppEngine using JDO如何使用 JDO 查询 AppEngine 中的单个字段
【发布时间】:2011-08-11 02:11:20
【问题描述】:

我有一个看起来像这样的产品 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 目前完全是空的。

我想检索该产品的所有 homePage 键,其中 features 为 true。

我在努力

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

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

但是,这给了我一个空指针错误。我应该如何构建这个查询?

干杯, 彼得

【问题讨论】:

  • 您正在混合使用单字符串 JDOQL 和程序化 JDOQL。如果指定你做的字符串 pm.newQuery("SELECT homePage FROM mydomain.MyModelClass WHERE features == true");

标签: google-app-engine jdo


【解决方案1】:

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

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

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

正如尼克在另一个回复中指出的那样,与自己做相比,这并没有带来任何性能提升……但是标准持久性 API 的全部意义在于保护您免受必须进行此类提取的数据存储特定性的影响;这一切都是开箱即用的。

【讨论】:

  • 是的,这就行了。我认为这是在将休眠样式映射到数据存储中的列。去显示我被屏蔽得有多好。 =) 即使没有性能原因,我认为我更喜欢这种方法。
  • @DataNucleus,如果 MyClass 中有多个字符串字段,我只想检索其中一个怎么办?
【解决方案2】:

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

【讨论】:

  • Nick,ProjectionResultTransformer 自 2009 年以来一直存在,用于将实体转换为单个字段(因此支持 JDOQL/JPQL 中的投影)。 google.com/codesearch#79kbA0UmWLw/trunk/src/org/datanucleus/…
  • @DataNucleus 我不知道 App Engine 是否支持这一点,但关键仍然是它仍然会导致从数据存储区获取和解码整个实体 - 所以如果目标是性能改进,没有收获。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-29
  • 1970-01-01
  • 2011-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多