ibernare come recuperare un oggetto gerarchico
Domanda
Ho i seguenti bean Task, ServerDetails e ApplicationDetails. Desidero recuperare tutte le attività, i dettagli del loro server e i dettagli dell'applicazione in base a un nome specifico dell'applicazione.
Dal risultato mi aspetto di essere in grado di recuperare i dati in un modo come: task.getServers (). getApplicationDetails ()
In realtà, ottengo quella che sembra essere la rappresentazione di dati flat come un oggetto [].
Esiste un modo per fare ciò che propongo?
Segue il mio codice ...
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();
Soluzione
Dovresti semplicemente recuperare l'oggetto principale.
Per l'altro, puoi:
- naviga verso di loro mentre
Sessione
non è stato chiuso (esegue query aggiuntive in base alle esigenze, noto come pigro; questo è l'ideale per facilità d'uso) - recuperali nella query originale usando la parola chiave
fetch
.
Esempio:
SELECT h
FROM Task h
JOIN FETCH h.serveurs ser
JOIN FETCH ser.applications app
WHERE h.executionDate >
.... // no need to specify the joins
Sarai in grado di recuperare i dati in un modo come:
task.getServers (). GetApplicationDetails ()
Altri suggerimenti
Puoi recuperare il grafico dell'oggetto come hanno già detto gli altri usando LEFT JOIN FECH. Un creento che ho trovato durante il recupero di grafici a oggetti, quando si cammina lungo una relazione molti-a-uno non è possibile risalire senza un ulteriore accesso al database.