我有一个类,其中包含一个单向一对多关系,如下所示:
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
这会返回试图取消引用集合的非法尝试,那么我应该如何过滤我的项目呢?
编辑:
票务解决方案实际上是正确的,我最初误读了解决方案。