Прежде всего, я впервые использую Hibernate, поэтому мои вопросы могут показаться наивными.
У меня есть две таблицы: DsJobs и DsEvents.События имеют отношение внешнего ключа к таблице DsJobs (столбец EID в таблице DsJobs соответствует столбцу ID таблицы DsEvents).
Я создал отображение с аннотациями, и меня волнует одностороннее отношение, поэтому яиметь свойство 'dsEvents' в таблице DsJobs с аннотацией @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 объекта DsJobs, и внутри каждого объекта DsJobs есть объект DsEvents, правильно созданный.
У меня две проблемы:
Когда я вижу, что HQL выполнен, возникают ненужные вызовы SELECT для базы данных, по одному на каждую запись DsJobs.Таким образом, для каждой записи DsJobs в DsEvents есть SELECT, чтобы получить событие coresponding по идентификатору события.Это неприемлемо для производительности, поскольку с помощью простого JDBC я могу получить все необходимые данные с помощью внутреннего SELECT-элемента SELECT.Я, вероятно, делаю что-то не так, пожалуйста, дайте мне знать, что и если вы знаете, как мне поступить.
setFirstResult и setMaxResults, кажется, полностью игнорируются Hibernate, я всегда получаюзаписи из базы данных.Как я могу это исправить?
Я буду очень признателен за любую помощь.
Заранее спасибо.