Hibernate外键关系-list()进行不必要的sql查询-忽略setMaxResults

Hibernate外键关系-list()进行不必要的sql查询-忽略setMaxResults,hibernate,list,Hibernate,List,首先,这是我第一次使用Hibernate,所以我的问题可能看起来很幼稚 我有两个表,DsJobs和DsEvents。事件在DsJobs表上具有外键关系(DsJobs表中的EID列对应于DsEvents表的ID列) 我已经用anotations创建了映射,我关心的是单边关系,因此我在DsJobs表中有一个“dsEvents”属性,用@ManyToOne注释: @Entity @Table(name="DsJobs") public class DsJobs implements java.io.

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

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

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

@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;
    }
....
}
我想从数据库中检索作业记录列表,并用setFirstResult和setMaxResults限制它们。这是我的电话:

return (ArrayList<DsJobs>) this.sessionFactory.getCurrentSession().createQuery("from DsJobs log").setFirstResult(start).setMaxResults(rows).list();
返回(ArrayList)this.sessionFactory.getCurrentSession().createQuery(“来自DsJobs日志”).setFirstResult(开始).setMaxResults(行).list();
这段代码返回一个DsJobs对象的ArrayList,在每个DsJobs对象中都有一个DsEvents对象,已正确实例化

我的问题有两个:

  • 当我看到执行HQL时,会有不必要的对数据库的SELECT调用,每个DsJobs记录调用一个。因此,对于每个DsJobs记录,DsEvents中都有一个SELECT,用于按事件id获取相应的事件。这对于性能来说是不可接受的,因为使用简单的JDBC,我可以通过内部连接SELECT语句获取所需的所有数据。我可能做了一些完全错误的事情,请让我知道什么,如果你知道我应该如何继续

  • setFirstResult和setMaxResults似乎被Hibernate完全忽略了,我总是从数据库中获取所有记录。我怎样才能解决这个问题

  • 我将非常感谢任何帮助


    提前感谢您。

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

    对于2,你的用法听起来是正确的。我需要更多的细节来看看这是怎么回事

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

    是的,这就是可怕的n+1选择问题。只有在对关系强制某些RI约束(例如,一对一约束或唯一约束)时,才会发生这种情况。你给我们看的地图似乎没有这些问题,这让我觉得你没有给我们看给你带来麻烦的实际地图。请发布实际的代码,而不是它的一般化、缩写版本

    setFirstResult和setMaxResults似乎被Hibernate完全忽略了,我总是从数据库中获取所有记录。我怎样才能解决这个问题


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

    这正是我的问题,谢谢您的回答。我不完全理解为什么会发生这种情况,但我能够解决这个查询的第一个问题:从DsJobs log left join fetch log.dsEvents。