有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

我的问题是如何获取所有库存项目的库存id,例如48。我知道我可以获取inventory对象并执行数组子列表,但这似乎效率很低

当我尝试执行查询时,它无法按预期工作,我理解其中一些原因,因为不支持联接,但如果我可以访问当时库存项表的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) 个答案

  1. # 1 楼答案

    在这种情况下,我不想在实体之间建立任何关系,我只需要为我的一个实体创建一个键,并将另一个实体中的同一个键保存为外键,因此如果我需要查询子实体,我会使用外键作为返回结果的依据

    我最近开始使用Objectify,我建议您,如果需要此类问题,可以使用Objectify将数据持久化到Appengine数据存储。这是非常有效和简单的学习和使用

  2. # 2 楼答案

    这个JPA查询行吗? 应该是这样的:

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