我有一个具有单向一对多关系的类,如下所示:
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
哪个会返回非法尝试取消对收藏的引用,那么如何过滤我的物品?
票务解决方案实际上是正确的,我原来是看错了解决方案。
select item from Order order inner join order.items item where order = :order and ...
HQL查询使用实体及其关联。关联是否使用联接表这一事实对于HQL并不重要:您可以在关联中进行导航,然后Hibernate会进行适当的SQL转换。