Hibernate - 使用HQL从单向OneToMany关系中获取集合

8

我有一个类,其中包含一个单向一对多关系,如下所示:

public class Order {
    @OneToMany(cascade = CascadeType.ALL)
    @JoinTable(name="order_item", joinColumns={@JoinColumn(name="order_id")}, inverseJoinColumns={@JoinColumn(name="item_id")})
    public Set<Item> getItems() {
        return items;
    }
} 

通常获取此订单的内容很简单:
List<Item> items = order.getItems();

但出于某种原因,我可能想以某种方式筛选结果,并快速地检索出一部分条目集合,例如所有高于某个价格、低于某个库存等。为了做到这一点,我将运行一个HQL查询,以检索特定订单的物品,并在我的where子句或查询对象中添加一些其他内容。

直观地说,我希望这种行为是(完全错误的):

SELECT jointable.ITEM from order_item as jointable inner join jointable.order where order = :order

但是,当涉及到HQL时,它是根据映射实体进行操作的,所以我不能在查询中使用联接表。那么正确的做法是什么呢?

编辑:

我已经找到了这个问题的答案,我需要以下查询:

Select o.items from Order o where o = ?

这使我能够获取订单的项目集合,而无需使用双向关系。但是,我现在对这个问题的第二阶段感到困惑,即如何过滤此集合的结果,最简单的示例是:

Select o.items from Order o where o = ? order by o.items.somenumberfield asc

这会返回试图取消引用集合的非法尝试,那么我应该如何过滤我的项目呢?

编辑:

票务解决方案实际上是正确的,我最初误读了解决方案。

2个回答

8
select item from Order order
inner join order.items item
where order = :order
and ...

3

听起来你想映射此关系的另一侧,即创建双向映射。

然后你可以在HQL中使用订单编号:

from Item as item where item.amount > :amount and item.order.id = :orderId

根据HQL 文档:

from Cat as cat where cat.mate.id = 69 这个查询是有效的,不需要表连接。

您尝试执行此查询表明线路与其订单之间的关系很重要!


1
不需要进行双向关联。 - JB Nizet
你不需要这样做,但这并不意味着你不应该这样做。Hibernate文档解释说,对于已映射双方的情况,此实例的HQL被优化了。 - Alex Barnes
你有两个可行的解决方案。你编辑中的HQL并不是很合理。你需要考虑对象及其属性以及遍历对象图。 - Alex Barnes
我必须表示不同意。我的订单包含一系列项目,这些项目通过单向一对多关系进行映射。我的项目类没有其订单作为成员,否则这将是双向关系。换句话说,item.order将无法工作,因为item没有订单字段。 - mogronalol

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接