【问题标题】:Hibernate foreign key relation - list() makes unnecessary sql queries - setMaxResults ignoredHibernate 外键关系 - list() 进行不必要的 sql 查询 - setMaxResults 被忽略
【发布时间】:2011-05-28 20:44:34
【问题描述】:

首先,这是我第一次使用 Hibernate,所以我的问题可能看起来很幼稚。

我有两个表,DsJobs 和 DsEvents。 Events 在 DsJobs 表上有外键关系(DsJobs 表中的 EID 列对应 DsEvents 表的 ID 列)。

我已经用注释创建了映射,我关心的是单边关系,所以我在 DsJobs 表中有一个用@ManyToOne 注释的“dsEvents”属性:

@Entity
@Table(name="DsJobs")
public class DsJobs  implements java.io.Serializable {

...

     private DsEvents dsEvents;
   ...

     @Id
    @Column(name="JID", unique=true, nullable=false)
    public long getJid() {
        return this.jid;
    }

    public void setJid(long jid) {
        this.jid = jid;
    }

@ManyToOne
    @JoinColumn(name="eid")

    public DsEvents getDsEvents() {
        return this.dsEvents;
    }

    public void setDsEvents(DsEvents dsEvents) {
        this.dsEvents = dsEvents;
    }
....
}

我想从数据库中检索 Jobs 记录列表并使用 setFirstResult 和 setMaxResults 限制它们。这是我打的电话:

return (ArrayList<DsJobs>) this.sessionFactory.getCurrentSession().createQuery("from DsJobs log").setFirstResult(start).setMaxResults(rows).list();

此代码返回一个 DsJobs 对象的 ArrayList,并且在每个 DsJobs 对象中都有一个正确实例化的 DsEvents 对象。

我的问题有两个:

  1. 当我看到 HQL 执行时,对数据库有不必要的 SELECT 调用,每个 DsJobs 记录都有一个。因此,对于每条 DsJobs 记录,在 DsEvents 中都有一个 SELECT 用于通过事件 id 获取对应的事件。这对性能来说是不可接受的,因为使用简单的 JDBC,我可以使用内部连接 ​​SELECT 语句获取我需要的所有数据。我可能做错了什么,如果你知道我应该怎么做,请告诉我。

  2. Hibernate 似乎完全忽略了 setFirstResult 和 setMaxResults,我总是从数据库中获取所有记录。我该如何解决这个问题?

我将非常感谢任何帮助。

提前谢谢你。

【问题讨论】:

    标签: hibernate list


    【解决方案1】:

    当我看到 HQL 执行时,对数据库进行了不必要的 SELECT 调用,每个 DsJobs 记录一个。

    是的,这是可怕的 n+1 选择问题。这仅在您对关系强制执行某些 RI 约束(例如,一对一或唯一约束)时才会发生。您向我们展示的映射似乎没有这些问题,这让我认为您没有向我们展示给您带来麻烦的实际映射。请发布实际代码,而不是一些通用的缩写版本。

    Hibernate 似乎完全忽略了 setFirstResult 和 setMaxResults,我总是从数据库中获取所有记录。我该如何解决?

    这段代码也很好。这意味着您没有向我们展示给您带来麻烦的实际代码。

    【讨论】:

    • 这正是我的问题,谢谢您的回答。我不完全了解为什么会发生这种情况,但我能够解决此查询的第一个问题: from DsJobs log left join fetch log.dsEvents 。
    【解决方案2】:

    对于 1,您可能想阅读有关延迟/急切加载的信息。在您的情况下,您似乎希望立即加载,即一次检索所有数据。有关详细信息,请参阅此 wiki 页面:http://community.jboss.org/wiki/AShortPrimerOnFetchingStrategies

    对于 2,您的用法听起来是正确的。我需要更多细节来看看它是怎么错的。

    【讨论】:

      猜你喜欢
      • 2021-02-17
      • 2015-10-29
      • 2018-10-09
      • 1970-01-01
      • 1970-01-01
      • 2010-10-01
      • 2014-08-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多