我正在尝试做一些简单的事情,但我认为使用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"
这里我尝试查询首先获取对象,然后尝试使用该对象作为参数进行查询,但除非对象是“嵌入式”,否则这不起作用
我首选的解决方案是第一次查询操作,但我很确定使用大表是不可能的。我仍然感到困惑,为什么第二次操作不起作用。
任何帮助都将不胜感激。
答案 0 :(得分:2)
在这种情况下,我更喜欢而不是在实体之间放置任何关系,我只是为我的一个实体创建Key,并将另一个实体中的相同密钥保存为外键,所以如果我需要查询子项实体我使用外键取回我的结果。
我最近开始使用Objectify,我建议您如果需要这样的问题,可以使用objectify将数据保存到Appengine Datastore。它非常有效且易于学习和使用。
答案 1 :(得分:2)
JPA查询是否正常? 它应该是这样的:
select item from InventoryItem item where item.inventory.id = :inventoryId