【发布时间】: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 对象。
我的问题有两个:
当我看到 HQL 执行时,对数据库有不必要的 SELECT 调用,每个 DsJobs 记录都有一个。因此,对于每条 DsJobs 记录,在 DsEvents 中都有一个 SELECT 用于通过事件 id 获取对应的事件。这对性能来说是不可接受的,因为使用简单的 JDBC,我可以使用内部连接 SELECT 语句获取我需要的所有数据。我可能做错了什么,如果你知道我应该怎么做,请告诉我。
Hibernate 似乎完全忽略了 setFirstResult 和 setMaxResults,我总是从数据库中获取所有记录。我该如何解决这个问题?
我将非常感谢任何帮助。
提前谢谢你。
【问题讨论】: