спящий режим, как получить объект иерархии
Вопрос
У меня есть следующие bean-компоненты Task, ServerDetails и ApplicationDetails.Я хочу получить все задачи, сведения об их серверах и сведения о приложении на основе определенного имени приложения.
В результате я ожидаю, что смогу получить данные таким образом:Task.getServers().getApplicationDetails()
На самом деле я получаю то, что кажется плоским представлением данных в виде Object[].
Есть ли способ сделать то, что я предлагаю?
Ниже приведен мой код...
class Task {
private String taskId;
private Set<ServerDetails> servers;
}
class ServerDetails {
private String id;
private Set<ApplicationDetails> applications;
}
class ApplicationDetails {
private String id;
}
ХКЛ:
StringBuilder hql = new StringBuilder(256);
hql.append("FROM Task h, ServerDetails ser, ApplicationDetails app ");
hql.append("WHERE h.executionDate > ");
hql.append("to_date('");
hql.append(DBDateFormatter.getInstance().formatDate(cal));
hql.append("', '");
hql.append(DBDateFormatter.getInstance().getOracleDateFormat());
hql.append("') and h.id = ser.task.id and ser.id = app.server and app.name = 'XXX'");
hql.append(" order by h.executionDate desc");
String hql = hql.toString();
Query query = session.createQuery(hql);
results = (List<Object[]>) query.list();
Решение
Вам нужно просто получить основной объект.
Для другого вы можете:
- перейдите к ним, пока
Session
не был закрыт (при необходимости выполняются дополнительные запросы, известные как lazy ;это идеально для простоты использования) - получить их в исходном запросе, используя
fetch
ключевое слово.
Пример:
SELECT h
FROM Task h
JOIN FETCH h.serveurs ser
JOIN FETCH ser.applications app
WHERE h.executionDate >
.... // no need to specify the joins
Вы сможете получить данные такими способами, как:
task.getServers().getApplicationDetails()
Другие советы
Вы можете получить граф объекта, как говорили другие, используя LEFT JOIN FECH.При извлечении графов объектов я обнаружил одну проблему: при переходе по отношению «многие к одному» вы не можете вернуться назад без дополнительного доступа к базе данных.