【问题标题】:Newest objects from the GAE datastore with JDO?GAE 数据存储中的最新对象与 JDO?
【发布时间】:2011-01-29 01:38:23
【问题描述】:

我在 Google App Engine 应用程序中有一个“消息”类,我想从数据存储中检索最后(最新)的;喜欢 20 条最新消息。它看起来很基础,但我不知道如何使用 JDO 创建这样的查询。

【问题讨论】:

    标签: google-app-engine google-cloud-datastore jdo


    【解决方案1】:

    首先,您必须在每个Message 实体上存储一个时间戳。然后,完成后:

    public List<Person> get20NewestMessages() {
      Query q = new Query("Message")
      q.addSort("timestamp", SortDirection.DESCENDING);
      PreparedQuery pq = ds.prepare(q);
      return pq.asList(FetchOptions.Builder.withLimit(20));
    }
    

    edit 正如您所指出的,这使用了低级数据存储。下面是一个 JDO 示例供您试用:

    Query query = pm.newQuery(Message.class);
    query.setOrdering("timestamp desc");
    query.setRange(0, 20);
    List<Message> messages = (List) query.execute();
    

    (这个我没测试过,可能不行)

    【讨论】:

    • 您的解决方案使用低级 Java 数据存储 API,但它为我提供了使用 JDO 执行此操作所需的所有元素。非常感谢。
    • 如果您的实体已经有一个数字 ID 字段,那么您也可以使用它来代替时间戳 - 即获取具有最高 ID 的 20 条消息。
    • 自动递增的数字 ID 字段效率非常低,因为它需要在每次插入时读取才能找到当前的最高数字。使用时间戳要好得多,它不需要知道有关数据存储区中其他实体的任何信息。
    • App Engine 上的@Todd ID 不能保证是连续的,只能是唯一的。 @Jason App Engine 提供唯一的数字 ID,没有您描述的低效率。
    • @Nick 唯一 ID,是的,但不是自动递增的,这样您就可以像 @Todd 所描述的那样获得 N 个“最新”实体。
    【解决方案2】:
    import javax.jdo.PersistenceManager;
    import javax.jdo.Query;
    import javax.jdo.Transaction;
    ...
    
    public List<Message> get20NewestMessages() {
        PersistenceManager pm = PMF.get().getPersistenceManager();      
        Query q = pm.newQuery(Message.class);
        q.setOrdering("timestamp desc");
        q.setRange(0, 20);
        List<Message> messages = (List<Message>) q.execute();
        return messages;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-19
      • 2012-01-05
      • 1970-01-01
      • 1970-01-01
      • 2013-10-23
      • 2012-04-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多