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

mog*_*lol 8 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;
    }
} 
Run Code Online (Sandbox Code Playgroud)

通常获取此订单的内容很简单:

List<Item> items = order.getItems();
Run Code Online (Sandbox Code Playgroud)

但无论出于何种原因,我可能希望以某种方式过滤我的结果,并以最快的方式检索项目集合的一部分,例如超过特定价格的所有项目,低于特定股票等(不返回然后全部过滤然后).为此,我将运行HQL查询来检索特定订单的项目,并将更多内容添加到我的where子句或我的查询对象中.

直觉我会想要这种行为(这是完全错误的):

SELECT jointable.ITEM from order_item as jointable inner join jointable.order where order = :order
Run Code Online (Sandbox Code Playgroud)

但当然这是错误的,因为HQL在映射实体方面起作用,所以我不能在查询中使用连接表.那么这样做的正确方法是什么?

编辑:

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

Select o.items from Order o where o = ?
Run Code Online (Sandbox Code Playgroud)

这允许我获取订单的项目集合,而不必使用双向关系.我现在对这个问题的第二阶段感到困惑,这是如何过滤这个集合的结果,最简单的例子是:

Select o.items from Order o where o = ? order by o.items.somenumberfield asc
Run Code Online (Sandbox Code Playgroud)

哪个返回非法尝试取消引用收集,那么我将如何过滤我的项目?

编辑:

票证解决方案实际上是正确的,我最初误解了解决方案.

JB *_*zet 7

select item from Order order
inner join order.items item
where order = :order
and ...
Run Code Online (Sandbox Code Playgroud)

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