如何按键选择单个实体(低级Java数据存储区API)

时间:2013-01-16 22:22:26

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

我对如何创建“Key”对象以准确选择我的实体的一行(“客户”)感到困惑。

我的代码:

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 =“your email”name =“your name”
  • id / name = 2 email =“your email”name =“your name”
  • id / name = 3 email =“your email”name =“your name”

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

但没有成功。

当我以编程方式在“客户”上执行搜索(asList)并打印键值时,我看到:

  • 第1行密钥=客户(“您的名字”)/客户(1)
  • 第2行key =客户(“您的名字”)/客户(2)
  • 第3行密钥=客户(“您的名字”)/客户(3)

密钥的可打印值的格式为:“实体(名称)/实体(id / name)”

如何在代码中创建此类键值? 在javadoc上我只看到:

  • createKey(“kind”,id)
  • createKey(“kind”,“name”)

其他方法需要一个祖先,我没有创建一个祖先.... 这是我为创建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”给出以下结果的Key?

  • 代码:log.info(“customer KeyFactory.keyToString =”+ KeyFactory.keyToString(key));
  • 输出:INFO:客户KeyFactory.keyToString =客户(“您的名字”)/客户(1)

3 个答案:

答案 0 :(得分: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");

答案 1 :(得分:0)

答案 2 :(得分:0)

让我们假设您有一个名为Product的Java实体类,并且您希望在给定其密钥的情况下检索唯一记录,即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