Hibernate - 用于从Unidirectional OneToMany关系中获取集合的HQL

时间:2011-11-24 09:52:03

标签: java hibernate hql

我有一个具有单向一对多关系的类,如下所示:

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 个答案:

答案 0 :(得分:7)

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

HQL查询使用实体及其关联。关联使用连接表的事实对于HQL并不重要:您可以浏览关联,Hibernate会对SQL进行适当的转换。

答案 1 :(得分:3)

听起来你想要映射这种关系的另一面,即进行这种双向映射。

然后您可以使用HQL中的订单号:

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

来自HQL documentation

  

来自cat as cat,其中cat.mate.id = 69   查询是有效的,不需要表连接。

您尝试执行此查询的事实表明,Line与其订单之间的关系非常重要!