2 Stimmen

hibernate wie man ein Hierarchieobjekt abruft

Ich habe die folgenden Beans Task, ServerDetails und ApplicationDetails. Ich möchte alle Aufgaben, ihre Serverdetails und Anwendungsdetails basierend auf einem bestimmten Anwendungsnamen abrufen.

Von dem Ergebnis erwarte ich, dass ich die Daten auf eine Art und Weise wie folgt abrufen kann: task.getServers().getApplicationDetails()

In Wirklichkeit erhalte ich eine scheinbar flache Datendarstellung als Object[].

Gibt es eine Möglichkeit, das zu tun, was ich vorschlage?

Hier ist mein 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();

3voto

KLE Punkte 22895

Sie sollten nur das Hauptobjekt abrufen.

Für das andere können Sie:

  1. zu ihnen navigieren, während die Session nicht geschlossen werden muss (führt zusätzliche Abfragen nach Bedarf aus, bekannt als "lazy"; dies ist ideal für die Benutzerfreundlichkeit)
  2. sie in der ursprünglichen Abfrage abrufen, indem Sie die fetch Stichwort.

Beispiel:

    SELECT h 
    FROM Task h
    JOIN FETCH h.serveurs ser
    JOIN FETCH ser.applications app 
    WHERE h.executionDate > 
    .... // no need to specify the joins

Sie können die Daten z. B. auf folgende Weise abrufen:
task.getServers().getApplicationDetails()

0voto

James Punkte 17

Sie können den Objektgraphen, wie die anderen gesagt haben, mit LEFT JOIN FECH abrufen. Ein Problem, das ich beim Abrufen von Objektgraphen festgestellt habe, ist, dass man beim Abwärtsgehen einer Viele-zu-Eins-Beziehung nicht ohne zusätzlichen Datenbankzugriff wieder nach oben gehen kann.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X