【问题标题】:Objectify query by raw datastore Key通过原始数据存储键对象化查询
【发布时间】:2016-01-11 21:57:26
【问题描述】:

我无法理解从 JDO 到 Objectify 的升级过程。

所以我有这门课:

@PersistenceCapable
public class AppUser { 
    /**
     * key from userID
     */
    @PrimaryKey
    @Persistent
    private Key key;

    //...
}

我将其升级为:

@Entity
public class AppUser { 
    /**
     * key from userID
     */
    @Index Key key;
    @Id Long id;

    // ...
}

在更改之前,我能够使用以下方法检索实体:

Key _key = KeyFactory.createKey(AppUser.class.getSimpleName(), user.getUserId());
PersistenceManager pm = PMF.get().getPersistenceManager();
AppUser appUser = pm.getObjectById(AppUser.class, _key);

其中user 对象是 AppEngine 的用户对象,由 Google 帐户引用。

如何查询给定用户的实体?当我尝试使用 filterKey 时,结果为空对象。 提前致谢。

【问题讨论】:

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


    【解决方案1】:

    目前您的key 属性只是一个索引属性,因此您应该可以使用

    查询它
    ofy().load().type(AppUser.class).filter("key", Key.create(AppUser.class, id)).list();
    

    我觉得这不是您想要的,因为您在上面的代码示例中没有 id key 属性。此外, Key 属性将是对我在您的第一个代码示例中看不到的另一个实体的引用。所以我假设你真的只想使用 id。现在我不知道你的键是数字还是字符串,但我假设你正在寻找这样的东西:

    @Entity
    public class AppUser { 
        @Id Long key; // you can replace Long with String if your ids are strings
    }
    

    然后你可以通过 id 查询,像这样

    ofy().load().type(AppUser.class).id(userIdOrName).list();
    

    或者一个键查询看起来像这样

    ofy().load().key(Key.create(AppUser.class, userIdOrName));
    

    【讨论】:

    • 这不一定是我要找的。我的旧 API 使用原始密钥来查找实体。但是,现在,当我尝试使用 filterKeyofy() 对象查询键时,它返回 null。我尝试了不同的值:与以前一样的键、新的数字 ID、旧的字符串 ID、Ref>、Key> 和 Key 对象。没有任何效果。最终我停止了工作,因为现在有更重要的事情要做。但我迟早会回到这个问题,因为在我的情况下,API 发生了不可逆转的变化。
    • 只有当 Key 是对不同实体的引用时,才使用 Objectify 定义它。当您使用 @Id 注释定义属性时,会隐式创建实体本身的键。也许您可以在高层次上描述更多您正在尝试做的事情。您的原始密钥的外观也应该有所帮助。大多数键表示可以转换为不同的表示,因此您可能必须先进行键转换,然后才能使用 objectify 进行查询。
    猜你喜欢
    • 1970-01-01
    • 2014-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-24
    • 1970-01-01
    • 2014-01-08
    • 1970-01-01
    相关资源
    最近更新 更多