【问题标题】:How to select a single Entity by key (low level java datastore API)如何按键选择单个实体(低级 java 数据存储 API)
【发布时间】:2014-05-08 19:47:46
【问题描述】:

我对如何创建“键”对象来准确选择我的实体(“客户”)的 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("客户", 1); 和 KeyFactory.createKey("客户", "你的名字");

但没有成功。

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

  • 第 1 行键 = Customer("your name")/Customer(1)
  • 第 2 行键 = Customer("your name")/Customer(2)
  • 第 3 行键 = Customer("your name")/Customer(3)

键的可打印值格式为:“Entity(name)/Entity(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: customer KeyFactory.keyToString = Customer("your name")/Customer(1)

【问题讨论】:

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


    【解决方案1】:

    实体的创建不正确。 您不必自己创建密钥。 如果您使用 kind 和 keyname 或 ID 参数创建实体,则会根据 kind 和 keyname 或 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");
    

    【讨论】:

      【解决方案2】:

      【讨论】:

      • 这是我的问题。我不知道如何创建密钥。
      • 通常情况下,我只是让数据存储为我制作密钥。但是,如果您需要为实体分配显式 ID,我是这样做的:首先使用带有实体名称和 ID 的 KeyFactory.createKey,然后创建一个将 Key 类传递给构造函数的实体,然后使用 setProperties 将值分配给创建的实体,然后调用 DatastoreService.put 将实体作为参数传递。
      • 您可以为 createKey(kind, name) 使用任意字符串。例如,我创建了一个键(“sphere”,“Test Title2/601”),然后创建实体并将 Title 设置为“Test Title2”并放置它。实体的关键字符串是“sphere(\"Test Title2/601\")”。
      【解决方案3】:

      假设您有一个名为 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

      【讨论】:

      • 我没有 Java 实体类“Customer”,我使用的是低级 java api(我认为你只使用 jpa 和 jdo 将实体映射到 java 类)
      猜你喜欢
      • 2014-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多