Я пытаюсь сделать что-то простое, как я думал, но оно не работает должным образом, используя 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;
...
}
Когда я смотрю на Datastore Viewer, я вижу объекты с их коррелирующими столбцами отношений. Это таблица инвентаря, в которой есть список идентификаторов предметов инвентаря.
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 не имеет никакого смысла, поскольку это произвольный токен, но, похоже, должен быть способ выполнить этот тип запроса с не принадлежащей ему конфигурацией @OneToMany(mappedBy="inventory").
Я попробовал и другой способ, назначив объект в качестве параметра, но, к моему удивлению, это тоже не сработало.
"Select from InventoryItem.class.getName() item where item.inventory = :inventory"
Здесь я пытаюсь выполнить запрос, сначала извлекая объект, а затем пытаясь выполнить запрос, используя этот объект в качестве параметра, но опять же это не сработало, если объекты не были «встроены».
Моим предпочтительным решением была бы первая операция запроса, но я почти уверен, что это невозможно с использованием большой таблицы. Я все еще не понимаю, почему вторая операция не работает.
Любая помощь будет оценена по достоинству.