使用Key.Id查询Google App Engine数据存储

问题描述:

我正在将一个简单的Java应用程序部署到Google App Engine。使用Key.Id查询Google App Engine数据存储

我有一个简单的JPA实体包含一个密钥作为我生成的ID。

import javax.persistence.*;  

@Entity 
public class MyEntity 
{ 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY)  
    private com.google.appengine.api.datastore.Key key; 
... 

一旦我坚持这个对象。我可以像这样查看密钥的ID ...

long id = entity.getKey().getId(); 

你知道我该如何使用相同的ID来获取我的实体吗?像这样的东西...

Query query = em.createQuery("SELECT e FROM MyEntity e WHERE e.key.id = :myId"); 
query.setParameter("myId", id); 

上述不起作用。我知道我可以通过将Key作为参数传递回来,但我想知道是否可以使用long id。

找到解决方案,使用KeyFactory创建一个Key并传入ID。然后在密钥上查询。

Key key = KeyFactory.createKey(MyEntity.class.getSimpleName(), id); 
+1

重要的是要记住,当使用此方法时,传入的'id'必须是'Long'类型。 – 2013-07-03 11:49:04

+0

任何其他使用'String'的方法? – serj 2015-02-18 21:54:50

有没有必要做一个查询所有的,因为数据存储本身支持的关键,这比执行查询明显更快获取的实体。请参阅文档this section

+0

你能帮忙提供一个JPA的例子吗?它看起来像PersistenceManager只适用于JDO。 – user424174 2010-09-03 09:59:14

+0

JPA记录在这里:http://code.google.com/appengine/docs/java/datastore/usingjpa.html – 2010-09-03 14:09:48

+0

感谢尼克,不幸的是,页面并没有告诉我如何使用它的密钥进行提取而不使用查询。 – user424174 2010-09-04 09:36:28

你可能想通了这一点很久以前的事,但对于其他人的利益,这是我要做的事在JPA:

entityManager.find(Reply.class, key) 

在数据存储开发者的管理控制台,你可以这样说:

SELECT * FROM MyEntity WHERE __key__ = Key(MyEntity, 5695872079757312)