【问题标题】:How to limit fetching of entities from SQL query如何限制从 SQL 查询中获取实体
【发布时间】:2009-10-15 09:47:31
【问题描述】:
SQLQuery query = session.createSQLQuery("select {o.id} from order o " +
        "LEFT JOIN bookings b ON b.id = o.bookingId " +
);
List pusList = query.addEntity(Order.class)
        .list();

按顺序我有:

@OneToOne(cascade = CascadeType.ALL, mappedBy = "order", fetch = FetchType.LAZY)
private Trip trip;

但在执行期间我看到: 拳头,主sql。和许多这样的查询: Hibernate: /* load Trip */ select......

我怎样才能拒绝获取 Trips?

更新: 在这种情况下,旅行是没有用的。更好的是不要获取它。

【问题讨论】:

  • trip 与您的查询以及 order 和 bookings 表有什么关系?是否有一些列在 order 或 bookings 中引用了旅行?哪个语句触发了您提到的所有 SQL 的执行(我假设它是“List pusList = ..”语句,但这不是很清楚..
  • 对不起,我准备的问题不好。预订没有链接到旅行。并且 Order 有到 Trip 的链接。 >>哪个语句触发了你提到的所有 SQL 的执行(我假设它是“List pusList = ..”语句,但这不是很清楚是的,它是“List pusList = ..”。而且,我不打电话此后的任何吸气剂。但我看到很多 SQL。

标签: sql hibernate entity


【解决方案1】:

您正在延迟获取,这意味着将加载主要内容,然后根据需要加载每次行程。

一般请参阅Hibernate performance documents 以了解可以做什么。

由于这是一对一的映射,因此我会将 fetch 更改为 fetch= FetchType.JOIN。这将在 main 加载行程的同时加载行程,而不再向数据库添加任何行程。

【讨论】:

  • 是的,但是在 list() 调用之后立即发生 Trips 的获取。
  • 如果你改变 fetch 类型,那么它们将与 main 同时加载。延迟加载意味着它们是在您在对象中访问它们的最晚时间完成的
【解决方案2】:

您设置的方式是,为了构建您的订单对象,数据库必须查看行程表(如果我正确阅读了您的定义,那么“行程”中有一个“订单”列' 引用订单的表)。你确定这真的是一对一的关系吗?我不知道您的域,但通常外键映射到一对多关系,并且该属性将是旅行或订单中的集合。

请提供有关您的表/关系和相应类的更多信息,尤其是应该包含关系的成员。我认为这为我们提供了更多信息来解释加载的原因以及可以采取哪些措施来避免加载。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-26
    • 2022-09-27
    • 1970-01-01
    • 1970-01-01
    • 2011-06-14
    • 1970-01-01
    • 2015-03-28
    • 1970-01-01
    相关资源
    最近更新 更多