hibernar cómo recuperar un objeto de jerarquía
Pregunta
Tengo los siguientes beans Task, ServerDetails y ApplicationDetails. Deseo recuperar todas las tareas, sus detalles del servidor y los detalles de la aplicación en función de un nombre de aplicación específico.
Del resultado espero poder recuperar los datos de una manera tal que: task.getServers (). getApplicationDetails ()
En realidad, obtengo lo que parece ser la representación de datos planos como un Objeto [].
¿Hay alguna forma de hacer lo que propongo?
Siguiente es mi código ...
class Task {
private String taskId;
private Set<ServerDetails> servers;
}
class ServerDetails {
private String id;
private Set<ApplicationDetails> applications;
}
class ApplicationDetails {
private String id;
}
HQL:
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();
Solución
Deberías recuperar el objeto principal.
Para el otro, puedes:
- navegue hacia ellos mientras la
Sesión
no se haya cerrado (ejecuta consultas adicionales según sea necesario, lo que se conoce como perezoso; esto es ideal para facilitar su uso) - recuperarlos en la consulta original utilizando la palabra clave
fetch
.
Ejemplo:
SELECT h
FROM Task h
JOIN FETCH h.serveurs ser
JOIN FETCH ser.applications app
WHERE h.executionDate >
.... // no need to specify the joins
Podrá recuperar los datos de una manera como:
task.getServers().getApplicationDetails()
Otros consejos
Puede recuperar el gráfico del objeto como los otros han dicho usando LEFT JOIN FECH. Una credencia que he encontrado al recuperar gráficos de objetos, al caminar por una relación de muchos a uno, no se puede caminar sin acceso adicional a la base de datos.