2012-12-19 11 views
5

Szukałem od jakiegoś czasu, ale nie znalazłem żadnego rozwiązania, aby wykonać następujące czynności.Wyświetl dodatkowe pole wielu do wielu relacji wewnątrz tabeli

Próbuję wyświetlić tabelę zawierającą listę powiedzmy użytkowników. Wyświetlanie pól od użytkowników nie jest wielkim problemem, ale jest trudniejsze w przypadku pól asocjacyjnych. Załóżmy, że mam następujące tabele: User, Post i UserPosts, w UserPosts mamy flagę główną, aby wskazać, czy dany post jest główną pozycją użytkownika, czy nie.

W moim datatable, muszę wyświetlić informacje użytkownika, to znaczy pola w tabeli użytkownika + jego/jej główny post.

tej pory mam coś takiego:

<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> 

myślę o pozycję będę musiał pobrać z bazy głównej pozycji danego użytkownika w danej kolumnie, ale potem, jak ustawić tę wartość (javascript , ajax?)

Czy myślę w niewłaściwy sposób, powinienem zamiast tego użyć klasy asocjacyjnej. Mam na myśli, odzyskać wszystkie UserPosts, gdzie pole główne = prawda? A następnie iteracyjne nad userPosts zamiast użytkowników, w tym przypadku, mam coś takiego:

<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> 

Wydaje się dziwne dla mnie, być może się mylę.

+0

Dlaczego nie dodasz do '$ {listUsers}' -model, w swoim kontrolerze, już postName? Lub, jeśli nie możesz lub nie chcesz, przekazać kolejny oddzielny model z wartościami? Ale wtedy musielibyście zapewnić, że pętla forEach nie jest losowa. – EricG

+0

Nie jestem pewien, czy rozumiem twój konkretny problem. Czy "Użytkownik" nie ma już właściwości 'List ', którą można po prostu powtórzyć w zagnieżdżonej pętli? – BalusC

+0

@EricG Oczywiście nie mogę zrobić pierwszej propozycji, a jeśli chodzi o drugą propozycję, spróbuję. Przepraszam, nie mogłem odpowiedzieć, aż do teraz. – aslan

Odpowiedz

1

Jeśli rozumiem układ danych poprawnie, masz coś takiego:

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

Jeśli to przypadek, można ustrukturyzowania swój obiekt użytkownika tak:

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

a twoje zapytanie będzie po prostu wymagało lewego sprzężenia w pozycji UserPosition, która jest oznaczona jako "główna". Ta pozycja użytkownika będzie wtedy łączyć się z prawidłową pozycją. Następnie Twój JSP musiałby po prostu sprawdzić, czy twój obiekt Pozycji był pusty.

<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> 
Powiązane problemy