GAE/JPA/Datastore Как сделать запрос к бесхозному списку

Я пытаюсь сделать что-то простое, как я думал, но оно не работает должным образом, используя 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"

Здесь я пытаюсь выполнить запрос, сначала извлекая объект, а затем пытаясь выполнить запрос, используя этот объект в качестве параметра, но опять же это не сработало, если объекты не были «встроены».

Моим предпочтительным решением была бы первая операция запроса, но я почти уверен, что это невозможно с использованием большой таблицы. Я все еще не понимаю, почему вторая операция не работает.

Любая помощь будет оценена по достоинству.


person Chris Hinshaw    schedule 22.12.2012    source источник


Ответы (2)


Что ж, в таких случаях я предпочитаю вместо того, чтобы устанавливать какие-либо отношения между объектами, я просто создаю ключ для одного из своих объектов и сохраняю тот же ключ в другом объекте в качестве внешнего ключа, поэтому, если мне нужно запросить дочерний объект, я использую Внешний ключ, как вернуть мои результаты.

Недавно я начал использовать Objectify и предлагаю вам, если вам нужны такие проблемы, использовать objectify для сохранения данных в Appengine Datastore. Он очень эффективен и прост в освоении и использовании.

person Ankur Jain    schedule 30.12.2012
comment
Согласен на использование ключа в некоторых ситуациях, но тогда это не зависит от API постоянства и прекрасно применимо с JDO (или JPA), поэтому не является причиной для изменения API. - person Neil Stockton; 31.12.2012
comment
Что ж, я предложил Objectify просто для того, чтобы сделать запросы более эффективными, не беспокоясь о транзакциях, потому что в этом случае ему нужно обновить несколько сущностей. В случае JDO/JPA нам нужно создавать транзакции при обновлении одного объекта, и я часто сталкиваюсь с ситуациями, когда один объект обновляется, а другой нет с JDO/JPA. - person Ankur Jain; 31.12.2012
comment
Я использовал objectify пару раз в разных проектах и ​​продолжаю возвращаться к jpa/jdo в целях переносимости. Я не покупаюсь на gae и хотел бы легко перейти к другому провайдеру без серьезной перезаписи модели/тестирования, которая может возникнуть при использовании objectify. Однако я нашел объективацию простой и функциональной. - person Chris Hinshaw; 31.12.2012

Этот запрос JPA в порядке? Это должно выглядеть так:

select item from InventoryItem item where item.inventory.id = :inventoryId
person tuga    schedule 02.01.2013