3

我对如何创建一个“键”对象来准确选择我的实体(“客户”)的 1 行有点困惑。

我的代码:

Query query = new Query("Customer");
// **** how do I have to create this key ???
Key key = KeyFactory.createKey("Customer", 1);
// ****
FilterPredicate keyFilter =  new FilterPredicate(Entity.KEY_RESERVED_PROPERTY,       FilterOperator.EQUAL, key);
query.setFilter(keyFilter);
DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
PreparedQuery pq = datastore.prepare(query);
Entity customer = pq.asSingleEntity();
if  (! (customer == null)) {
    log.info("OK !");
}
else {
    log.info("no customer found");
}

我的结果总是:“找不到客户”。

使用数据存储查看器(我在本地工作)我可以看到 3 行:

  • id/name = 1 email = "你的邮箱" name = "你的名字"
  • id/name = 2 email = "你的邮箱" name = "你的名字"
  • id/name = 3 email = "你的邮箱" name = "你的名字"

我想选择 id/name=1 的客户。我试过了: KeyFactory.createKey("Customer", 1); 和 KeyFactory.createKey("客户", "你的名字");

但没有成功。

当我以编程方式对“客户”进行搜索(asList)并打印我看到的键值时:

  • 第 1 行键 = 客户(“您的姓名”)/客户(1)
  • 第 2 行键 = 客户(“您的姓名”)/客户(2)
  • 第 3 行键 = 客户(“您的姓名”)/客户(3)

键的可打印值格式为:“Entity(name)/Entity(id/name)”

如何在我的代码中创建这样的键值?在 javadoc 我只看到:

  • createKey("种类", id)
  • createKey("种类", "名称")

其他方法需要一个祖先,我没有创建一个祖先....这是我为创建 3 行而执行的代码(它已经执行了 3 次):

Key customerKey = KeyFactory.createKey("Customer", "your name");
Entity customer = new Entity("Customer", customerKey);
customer.setProperty("name", "your name");
customer.setProperty("email", "your email");
DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
datastore.put(customer);

提前致谢 !

问候

最大限度

换句话说,如何创建一个“toString”给出以下结果的键?

  • 代码:log.info("客户KeyFactory.keyToString = "+KeyFactory.keyToString(key));
  • 输出:信息:客户 KeyFactory.keyToString = Customer("your name")/Customer(1)
4

3 回答 3

2

实体的创建不正确。您不必自己创建密钥。如果您使用种类和键名或 ID 参数创建实体,则会根据种类和键名或 ID 自动创建一个键。

Entity customer = new Entity("Customer", "your name");
customer.setProperty("email", "your email");

DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
datastore.put(customer);

这就是创建所需实体所需的全部内容。

当您提供种类和密钥时,将创建一个子实体。因此,您创建了一个带有“您的名字”的客户,该客户是 ID 为 1 的客户。

要使用密钥获取实体,您只需采用相同的参数来创建密钥。

Key key = KeyFactory.createKey("Customer", "your name");

我更喜欢使用 get(),但我不知道你想做什么。例如获取客户的电子邮件:

    Entity e;
    try {
        e = datastore.get(key);

        String myEmail= (String) e.getProperty("your email");
于 2014-05-08T11:47:46.587 回答
1

我认为当你有一个密钥时你想使用 get() 而不是 query()。

https://developers.google.com/appengine/docs/java/javadoc/com/google/appengine/api/datastore/DatastoreService#get(com.google.appengine.api.datastore.Key)

于 2013-01-16T23:05:45.677 回答
0

让我们假设您有一个称为 Java 实体类Product,并且您希望检索给定其键即 ID 的唯一记录

该方法看起来像这样:

    public Product getProduct(Long id) {

        //Get Persistence Manager
        PersistenceManager pm = ...;

        Key k = KeyFactory.createKey(Product.class.getSimpleName(), id);
        Product product = null;
        try {
           product = pm.getObjectById(Product.class, k);
        } 
        finally {
           pm.close();
        }

    return product;
}

所以在你的例子中,我认为你可以Product用你的类名替换。我猜你的班级名称是Customer

于 2013-01-17T00:16:03.693 回答