2

我正在尝试做一些我认为简单的事情,但使用 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)

我的问题是如何获取它们的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"

在这里,我通过首先获取对象然后尝试使用该对象作为参数进行查询来尝试查询,但除非对象被“嵌入”,否则这同样不起作用

我首选的解决方案是第一个查询操作,但我很确定这是不可能使用大表的。我仍然很困惑为什么第二个操作不起作用。

任何帮助,将不胜感激。

4

2 回答 2

2

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

我最近开始使用 Objectify,我建议您如果需要此类问题,可以使用 Objectify 将数据持久化到 Appengine Datastore。它非常高效且易于学习和使用。

于 2012-12-30T18:19:28.400 回答
2

那个 JPA 查询可以吗?它应该如下所示:

select item from InventoryItem item where item.inventory.id = :inventoryId
于 2013-01-02T00:15:58.437 回答