hibernate comment récupérer un objet de la hiérarchie
Question
J'ai les beans suivants Task, ServerDetails et ApplicationDetails. Je souhaite récupérer toutes les tâches, les détails de leur serveur et ceux de l'application en fonction d'un nom d'application spécifique.
D'après les résultats, je pense pouvoir récupérer les données de la manière suivante: task.getServers (). getApplicationDetails ()
En réalité, j'obtiens ce qui semble être une représentation de données à plat sous forme d'objet [].
Existe-t-il un moyen de faire ce que je propose?
Ce qui suit est mon code ...
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();
La solution
Vous devriez simplement récupérer l'objet principal.
Pour l’autre, vous pouvez:
- accédez-y tant que la
Session
n'a pas été fermée (exécute des requêtes supplémentaires en fonction des besoins, également appelée paresseux; idéal pour la facilité d'utilisation) - récupérez-les dans la requête d'origine à l'aide du mot clé
fetch
.
Exemple:
SELECT h
FROM Task h
JOIN FETCH h.serveurs ser
JOIN FETCH ser.applications app
WHERE h.executionDate >
.... // no need to specify the joins
Vous pourrez récupérer les données de la manière suivante:
task.getServers (). getApplicationDetails ()
Autres conseils
Vous pouvez récupérer le graphe d'objet comme d'autres l'ont dit à l'aide de LEFT JOIN FECH. Un invent que j'ai trouvé lors de la récupération de graphiques d'objet, lorsque vous vous promenez dans une relation plusieurs-à-un, vous ne pouvez pas revenir en arrière sans accès supplémentaire à la base de données.