当前位置: 首页 > 面试题库 >

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

杜凯
2023-03-14
问题内容

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

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转换。



 类似资料:
  • 问题内容: 假设我有两个实体: 然后,我要保留“客户”实体,然后,参照先前添加的“客户”保留“订单”实体。当我从数据库中检索此客户并调用getOrders时,它将返回空集。这是正常行为吗?如果是,当我添加新的Order实体时,我该怎么做以自动刷新此集合? 问题答案: Jpa不会为您维护关系,因此应用程序需要设置双向关系的两端,以使它们与数据库保持同步。当您设置了order-> customer关系

  • 问题内容: 我在JPA中使用实体映射存在以下问题。我有两个实体,第一个是Lookup,第二个是Text,它表示实体的翻译。现在,我需要将Lookup绑定到Text,但是我不希望Text引用Lookup。更复杂的是,Text在此关系中不使用其主键,而是在列中定义的元代码 。 因此,我尝试了这种方法(以及其他几种方法),但没有结果。我也不能在数据库中创建联接表,也不想将Lookup绑定到Text类。所

  • 关于JPA中的实体映射,我有以下问题。我有两个实体,第一个是查找,第二个是表示实体翻译的文本。现在我需要将Lookup绑定到文本,但我不希望文本引用Lookup。为了使这种情况更加复杂,文本在此关系中不使用其主键,而是使用列中定义的元码。 所以我尝试了这个(和其他一些变体),但没有结果。我也不能在数据库中创建连接表,我不想绑定查找到我的文本类。谁能告诉我有没有别的办法?

  • 我对冬眠学习还不熟悉,所以研究冬眠学习中使用的关系。我所了解的是-对于带有外键的一域单向关系映射,连接列将位于目标实体中(在我的示例中为Review类)。我不需要让它双向运行。 但是在实现它的同时,我得到了以下错误: OneToMany-单向-示例3 请帮帮忙!!!

  • 我有两个类:< code>User和< code>UserProfile。 用户类别: 用户配置文件类: 当我使用此代码时,我在具有多对多关系的表用户配置文件中获得重复的实体。我使用 函数来保存对象。我做错了什么? 然后我删除 cascadeType,出现错误:对象引用未保存的瞬态实例 - 在刷新之前保存瞬态实例。 Hibernate日志:

  • 我想在(您可以将其视为Student)实体和实体之间实现一个@ManyTomany单向的。很简单,一个教室可以有很多学生,而学生可以有很多教室。我希望它是单向的,因为我希望班级只知道它包含什么学生,学生不必知道他们有什么班级。这就是我目前所拥有的: ClassRoom.java Account.java 我通过以下代码保存它(使用Spring JPA): 但我得到了以下错误: 下面是StackTr