2012-12-19 10 views
5

Ho cercato un po 'di tempo ma non ho trovato alcuna soluzione per eseguire quanto segue.Visualizzazione di un campo aggiuntivo di relazione molti a molti all'interno di una tabella

Sto provando a visualizzare una tabella contenente l'elenco di diciamo Utenti. Non è un grosso problema visualizzare i campi dagli utenti, ma è più complicato per i campi di associazione. Diciamo che ho le seguenti tabelle: User, Post e UserPosts, in UserPosts abbiamo un flag principale per indicare se un dato post è la posizione principale dell'utente o meno.

Nel mio datatable, devo visualizzare le informazioni dell'utente, significa campi nella tabella utente + il suo post principale.

Finora ho qualcosa di simile:

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

Credo che per la posizione dovrò recuperare dal database posizione principale di un determinato utente in una data colonna, ma poi come impostare questo valore (javascript , ajax?)

Sto pensando nel modo sbagliato, dovrei usare invece la classe di associazione. Con ciò intendo, recuperare tutti gli UserPosts in cui il campo principale = true? E poi iterare su userPosts invece di utenti, in questo caso, avrò qualcosa di simile:

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

Sembra strano per me, forse mi sbaglio.

+0

Perché non si aggiunge al modello, $ {listUsers} ', nel proprio Controller, già il postName? Oppure, se non puoi o non vuoi, passare un altro modello separato con i valori? Ma allora dovresti assicurarti che il looporder forEach non è casuale. – EricG

+0

Non sono sicuro di aver compreso il tuo problema concreto. L'utente non ha già una proprietà 'Lista ' che puoi semplicemente ripetere in un ciclo annidato? – BalusC

+0

@EricG Io chiaramente non posso fare la prima cosa che proponi e per quanto riguarda la tua seconda proposizione, farò un tentativo. Scusa, non ho potuto rispondere fino ad ora. – aslan

risposta

1

Se ho capito bene il layout dei propri dati, è avere qualcosa di simile:

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

Se questo è il caso, è possibile strutturare l'oggetto utente in questo modo:

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

e la tua query dovrebbe semplicemente fare un join sinistro su UserPosition contrassegnato come "main". Quella UserPosition si unirebbe quindi alla posizione corretta. Quindi il tuo JSP dovrebbe solo verificare se il tuo oggetto Posizione era vuoto.

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