2012-12-19 6 views
5

Ich habe eine Weile gesucht, aber keine Lösung gefunden, um das Folgende zu tun.Zeige zusätzliches Feld einer Viele-zu-Viele-Beziehung in einer Tabelle

Ich versuche, eine Tabelle mit einer Liste von sagen wir Benutzer anzuzeigen. Es ist keine große Sache, Felder von Benutzern anzuzeigen, aber es ist komplizierter für Assoziationsfelder. Nehmen wir an, ich habe die folgenden Tabellen: User, Post und UserPosts, in UserPosts haben wir eine Flag-Hauptanzeige, um anzuzeigen, ob ein gegebener Post die Hauptposition des Benutzers ist oder nicht.

In meiner Datentabelle muss ich Benutzerinformationen anzeigen, es bedeutet Felder in Benutzer Tabelle + seine/ihre Hauptpost.

Bisher habe ich so etwas wie diese:

<table> 
    <thead> 
    <tr> 
     <th>name</th> 
     <th>FrstName</th> 
     <th>Age</th> 
     <th>Main position</th> 
     <th>Action</th> 
    </tr> 
     <tbody> 
      <c:forEach items="${listUsers}" var="user" varStatus="status"> 
      <tr> 
       <td><c:out value="${user.name}" /></td> 
       <td><c:out value="${user.firstName}" /></td> 
       <td><c:out value="${user.age}" /></td> 
       <td><c:out value="Position here" /></td> 
       <td> 
       Delete 
       <a href="/myAppli/user/${user.idUser}">Update</a> 
       </td> 
      </tr> 
      </c:forEach> 
     </tbody> 
</thead> 

ich für die Position denke ich, aus der Datenbank Haupt Position eines bestimmten Benutzers in einer bestimmten Spalte abgerufen werden muß, aber dann, wie dieser Wert setzen (Javascript Ajax?)

Ich denke den falschen Weg, sollte ich stattdessen die Assoziationsklasse verwenden. Damit meine ich, alle UserPosts abzurufen wo Hauptfeld = True? Und iteriert dann über userPosts anstelle der Nutzer, in diesem Fall werde ich so etwas wie dieses:

<c:forEach items="${listUserPosts}" var="userPost" varStatus="status"> 
     <tr> 
      <td><c:out value="${userPost.user.name}" /></td> 
      <td><c:out value="${userPost.user.firstName}" /></td> 
      <td><c:out value="${userPost.user.age}" /></td> 
      <td><c:out value="${userPost.post.postName}" /></td> 
      <td> 
      Delete 
      <a href="/myAppli/user/${userPost.user.idUser}">Update</a> 
      </td> 
     </tr> 
</c:forEach> 

Es mir seltsam scheint, vielleicht bin ich falsch.

+0

Warum fügen Sie dem '$ {listUsers}' -Modell, in Ihrem Controller, nicht schon den postName hinzu? Oder, wenn Sie nicht wollen oder nicht, ein anderes getrenntes Modell mit den Werten weitergeben? Aber dann müssen Sie sicherstellen, dass die forEach-Schleife nicht zufällig ist. – EricG

+0

Ich bin mir nicht sicher, ob ich dein konkretes Problem verstehe. Hat der 'Benutzer' nicht schon eine 'List ' Eigenschaft, die Sie einfach in einer verschachtelten Schleife durchlaufen können? – BalusC

+0

@EricG Ich kann das erste, was du vorschlägst, nicht tun, und was deinen zweiten Vorschlag betrifft, werde ich es versuchen. Entschuldigung, ich konnte bis jetzt nicht antworten. – aslan

Antwort

1

Wenn ich das Layout Ihrer Daten richtig zu verstehen, müssen Sie etwas wie folgt aus:

Data structure http://s12.postimage.org/wbz89nz8t/Untitled_drawing.png

Wenn das der Fall ist, können Sie Ihre User-Objekt wie folgt strukturiert:

public class User { 
    private int id; 
    private String name; 
    private String firstName; 
    private int age; 
    private Position mainPosition; 
} 

und Ihre Abfrage würde einfach einen linken Join auf der UserPosition machen müssen, die als "main" markiert ist. Diese UserPosition würde dann zur korrekten Position hinzugefügt werden. Dann müsste Ihre JSP nur überprüfen, ob Ihr Positionsobjekt leer ist.

<c:forEach items="${listUsers}" var="user" varStatus="status"> 
    <tr> 
    <td><c:out value="${user.name}" /></td> 
    <td><c:out value="${user.firstName}" /></td> 
    <td><c:out value="${user.age}" /></td> 
    <td> 
     <c:if test="empty ${user.position}"> 
     No main position 
     </c:if> 
     <c:if test="not empty ${user.position}"> 
     <c:out value="${user.position.title}" /> 
     </c:if> 
    </td> 
    <td> 
     Delete 
     <a href="/myAppli/user/${user.idUser}">Update</a> 
    </td> 
    </tr> 
</c:forEach> 
Verwandte Themen