我对如何创建“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的客户。 我试过了 : KeyFactory.createKey(“Customer”,1); 和 KeyFactory.createKey(“客户”,“你的名字”);
但没有成功。
当我以编程方式在“客户”上执行搜索(asList)并打印键值时,我看到:
密钥的可打印值的格式为:“实体(名称)/实体(id / name)”
如何在代码中创建此类键值? 在javadoc上我只看到:
其他方法需要一个祖先,我没有创建一个祖先.... 这是我为创建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?
答案 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)
我认为你有一个Key时想要使用get()而不是query()。
答案 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