2013-04-08 32 views
0


對於Google Appengine和jdo來說,這是新鮮事。我不知道如何用兩個實體在JDO中編寫查詢。我有UserProfile和UserFeed實體,如下所示。在Google App引擎中查詢兩個實體JDO

@PersistenceCapable 
public class UserProfile { 
@PrimaryKey 
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
private Key key; 

@Persistent 
private String firstName; 

@Persistent 
private String lastName; 

@Persistent 
private List<Key> friendProfileKeys; 
} 

@PersistenceCapable 
public class UserFeed { 
@PrimaryKey 
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
private Key key; 

@Persistent 
private Key profileKey; 

@Persistent 
private String comment; 

@Persistent 
private UserFeedType userFeedType;//Friends,Public 
} 

下面的查詢我用來獲取用戶發佈的提要列表。

final Query query = pm.newQuery(UserFeed.class); 
final List v; 

query.setFilter("profileKey == paramUserProfileKey"); 
query.declareParameters("com.google.appengine.api.datastore.Key paramUserProfileKey"); 

v = (List) query.execute(profile.getKey()); 

請幫助我獲取用戶和他的朋友發佈的訂閱源列表以及公共帖子。

+0

你得到什麼錯誤,在哪裏? – MikO 2013-04-08 12:02:19

+0

我的查詢只能用於獲取用戶提要列表。我知道如何使用UserProfile.friendProfileKeys和UserFeed.userFeedType從UserFeed實體獲取用戶好友Feed和公共Feed。 – 2013-04-08 12:16:02

+0

對不起,我並沒有最終理解你想要檢索的內容......你想要所有UserFeed類型爲public,以及與給定UserProfile相關的UserFeed,以及與所有UserProfiles相關的UserProfiles給UserProfile?你想在一個單一的查詢? – MikO 2013-04-08 13:14:34

回答

1

由於@DataNucleus在他的評論中說,GAE數據存儲不支持連接查詢,所以恐怕是不可能恢復所有你想要在一個單一的查詢檢索...

至於我知道你有兩個選擇:

第一選擇是使用幾個查詢:一個查詢要求所有的公共職位,像一個那麼其他查詢你寫的讓其他來獲得所有用戶的飼料,他的所有朋友和最後一個查詢每個朋友,要求他們的帖子...

第二個選擇是使用owned relationships。這樣你就必須改變你的鍵字段(「外鍵」,而不是主鍵!),並使用實際類的字段。例如,你應該有一個這樣的領域:

@Persistent 
private List<UserProfile> friendProfiles; 

@Persistent 
private UserProfile profile; 

這種方式,同時也作爲GAE/J的文件中稱,當您檢索例如一個UserFeed,你可以很容易地獲取相關User只是用:

retrievedUserFeed.getProfile(); 

,你也可以通過訪問檢索飼料的作家朋友:

retrievedUserFeed.getProfile().getFriendProfiles(); 

這些擁有關係有一個行爲我真的不能解釋你詳細(見前面的鏈接),但基本上,當您檢索具有與其他實體所擁有的關係,如果你不實體觸摸通訊員字段,相關實體永遠不會被檢索。在前面的例子,如果您檢索UserFeed但你永遠不使用getProfile()UserProfile永遠不會加載到內存中,從而節省資源的方法...

順便說一句,如果你使用這種方法,我強烈建議你具有UserProfile的關係UserFeed如:

@Persistent 
private List<UserFeed> ownedFeeds; 

因爲你將要離開UserProfileUserFeed不僅以相反的方式...(注:這是一個設計問題獨立GAE和JDO和無論什麼實施)

+0

謝謝你的回答,我決定用自己的關係來改變我的設計模式。 – 2013-04-11 11:34:34

相關問題