2012-12-22 27 views
2

查詢我試圖做一些簡單不過我想它不工作與使用大表和JPA預期的,我使用JPA DataNucleus將V2。GAE/JPA /數據存儲如何在無主的名單

@Entity 
public class Inventory extends DatastoreObject { 
... 

    /** 
    * List of all inventory items in this object. 
    */ 
    @OneToMany(mappedBy = "inventory", fetch = FetchType.LAZY, cascade={CascadeType.ALL}) 
    private List<InventoryItem> inventoryItems = new ArrayList<InventoryItem>(); 

... 

} 



@Entity 
public class InventoryItem extends DatastoreObject { 

    ... 

    @ManyToOne 
    private Inventory inventory; 

    ...  
} 

當我查看數據存儲查看器時,我看到具有相關關係列的實體。這是庫存表,其中包含庫存物料的ID列表。

Inventory Table 
    Key Write Ops ID/Name   inventoryItems 
    agxzbWFydGJhcnNpdGVyDwsSCUludmVudG9yeRgwDA 8 48  [InventoryItem(69)] 


Inventory Item Table 
    Key Write Ops ID/Name  inventory_id 
    agxzbWFydGJhcnNpdGVyEwsSDUludmVudG9yeUl0ZW0YRQw  14 69 Inventory(48) 

我的問題是我如何獲取所有庫存物品的,他們的inventory_id例如是48,我知道我可以獲取的清單對象,做一個陣列子表,但這似乎真的效率低下。

當我嘗試執行查詢時,它無法按預期工作,並且我瞭解一些原因,因爲連接不受支持,但似乎它能工作,如果我可以訪問庫存項目表的inventory_id列但看來我不能。

當我嘗試簡單的查詢,這將無法正常工作。

"Select from InventoryItem.class.getName() item where item.inventory.id = :inventoryId" 

我希望這將在DataNucleus將工作,我明白,這是典型的加入,但如果DataNucleus將知道這是一個無主的關係,該清單對象是由它映射的id不能這項工作不知何故?我知道.id屬性沒有任何意義,因爲它是一個任意的標記,但它似乎應該有一種方法來執行這種類型的查詢與無主@OneToMany(mappedBy =「inventory」)配置。

我試過的其他方式也由分配對象作爲參數,但令我驚訝這也不能工作。

"Select from InventoryItem.class.getName() item where item.inventory = :inventory" 

在這裏,我先取出對象,然後嘗試使用該對象作爲參數傳遞給查詢,但再次,除非對象是「嵌入式」

我首選的方案是這樣不起作用嘗試查詢第一個查詢操作,但我很確定這是不可能使用大表。儘管爲什麼第二個操作不起作用,我仍然感到困惑。

任何幫助,將不勝感激。

回答

2

那麼在這種情況下,我比較喜歡的,而不是把實體之間的任何關係,我簡單地創建爲我的實體的一個重點,我保存在其他實體作爲外鍵相同的密鑰,所以如果我需要查詢子實體我使用外鍵作爲回報我的結果。

我一直在使用物化最近開始,我建議你,如果你需要這樣那樣的問題,你可以使用物化數據持久化到AppEngine上的數據存儲。這是非常有效和簡單的學習和使用。

+0

同意使用在某些情況下一個重點,但隨後即不論持久性API的,並且是完全適用與JDO(或JPA),所以沒有理由去改變API –

+0

那麼我建議Objectify只是爲了使查詢更有效率而不用擔心事務,因爲在這種情況下他需要更新多個實體。在JDO/JPA的情況下,我們需要在更新單個實體時創建事務,而且我經常遇到一種情況,一種實體更新,另一種不與JDO/JPA一起使用。 –

+2

我已經在不同的項目上使用了幾次物化,並且爲了便攜性的目的繼續回到jpa/jdo。我沒有在gae上銷售,並且希望能夠輕鬆遷移到另一個提供商,而不需要使用對象化進行重大模型/測試重寫。儘管如此,我確實發現了客觀化的方便和功能。 –

2

是JPA查詢正常嗎? 它應該是這樣的:

select item from InventoryItem item where item.inventory.id = :inventoryId 
相關問題