2010-09-02 101 views
4

我正在將一個簡單的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。

回答

11

找到解決方案,使用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

5

有沒有必要做一個查詢所有的,因爲數據存儲本身支持的關鍵,這比執行查詢明顯更快獲取的實體。請參閱文檔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

0

你可能想通了這一點很久以前的事,但對於其他人的利益,這是我要做的事在JPA:

entityManager.find(Reply.class, key) 
0

在數據存儲開發者的管理控制檯,你可以這樣說:

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

相關問題