GAE / JPA / Datastore如何查询无主列表

时间:2012-12-22 16:47:14

标签: java google-app-engine jpa datanucleus

我正在尝试做一些简单的事情,但我认为使用Big Table和JPA没有按预期工作,我正在使用datanucleus jpa v2。

@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)

我的问题是如何获取所有库存项目的库存项目,例如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 个答案:

答案 0 :(得分:2)

在这种情况下,我更喜欢而不是在实体之间放置任何关系,我只是为我的一个实体创建Key,并将另一个实体中的相同密钥保存为外键,所以如果我需要查询子项实体我使用外键取回我的结果。

我最近开始使用Objectify,我建议您如果需要这样的问题,可以使用objectify将数据保存到Appengine Datastore。它非常有效且易于学习和使用。

答案 1 :(得分:2)

JPA查询是否正常? 它应该是这样的:

select item from InventoryItem item where item.inventory.id = :inventoryId