Hibernate外键关系-list()进行不必要的sql查询-忽略setMaxResults
首先,这是我第一次使用Hibernate,所以我的问题可能看起来很幼稚 我有两个表,DsJobs和DsEvents。事件在DsJobs表上具有外键关系(DsJobs表中的EID列对应于DsEvents表的ID列) 我已经用anotations创建了映射,我关心的是单边关系,因此我在DsJobs表中有一个“dsEvents”属性,用@ManyToOne注释: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.
@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对象,已正确实例化
我的问题有两个:
提前感谢您。对于1,您可能需要阅读有关延迟/急切加载的内容。在您的情况下,您似乎希望立即加载,即一次检索所有数据。有关详细信息,请参阅此wiki页面: 对于2,你的用法听起来是正确的。我需要更多的细节来看看这是怎么回事 当我看到执行HQL时,会有不必要的对数据库的SELECT调用,每个DsJobs记录调用一个 是的,这就是可怕的n+1选择问题。只有在对关系强制某些RI约束(例如,一对一约束或唯一约束)时,才会发生这种情况。你给我们看的地图似乎没有这些问题,这让我觉得你没有给我们看给你带来麻烦的实际地图。请发布实际的代码,而不是它的一般化、缩写版本 setFirstResult和setMaxResults似乎被Hibernate完全忽略了,我总是从数据库中获取所有记录。我怎样才能解决这个问题
这段代码也很好。这意味着您没有向我们显示给您带来麻烦的实际代码。这正是我的问题,谢谢您的回答。我不完全理解为什么会发生这种情况,但我能够解决这个查询的第一个问题:从DsJobs log left join fetch log.dsEvents。