2012-12-19 47 views
5

Tôi đã tìm kiếm một lúc nhưng không tìm thấy giải pháp nào để thực hiện các thao tác sau.Hiển thị trường thừa của mối quan hệ nhiều đến nhiều bên trong một bảng

Tôi đang cố hiển thị bảng chứa danh sách giả sử Người dùng. Nó không phải là một việc lớn để hiển thị các lĩnh vực từ người dùng nhưng nó là phức tạp hơn cho các lĩnh vực hiệp hội. Giả sử tôi có các bảng sau đây: User, Post và UserPosts, trong UserPosts, chúng ta có một flag chính để cho biết liệu một post nào đó có phải là vị trí chính của người dùng hay không.

Trong mục dữ liệu của mình, tôi phải hiển thị thông tin của người dùng, có nghĩa là các trường trong bảng người dùng + bài đăng chính của anh ấy/cô ấy.

Cho đến nay tôi có một cái gì đó như thế này:

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

Tôi nghĩ rằng cho vị trí tôi sẽ phải lấy từ vị trí chính cơ sở dữ liệu của người dùng được đưa ra trong một cột nào đó, nhưng sau đó làm thế nào để thiết lập giá trị này (javascript , ajax?)

Tôi đang nghĩ sai cách, tôi có nên sử dụng lớp kết hợp thay thế không. Bằng cách đó tôi có nghĩa là, lấy tất cả UserPosts nơi lĩnh vực chính = true? Và sau đó lặp trên userPosts thay vì người dùng, trong trường hợp đó, tôi sẽ có một cái gì đó như thế này:

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

Nó có vẻ lạ với tôi, có lẽ tôi là sai.

+0

Tại sao bạn không thêm vào '$ {listUsers}' -model, trong Bộ điều khiển của bạn, đã là postName chưa? Hoặc, nếu bạn không thể hoặc không muốn, vượt qua một mô hình riêng biệt với các giá trị? Nhưng sau đó bạn phải đảm bảo rằng vòng lặp forEach không phải là ngẫu nhiên. – EricG

+0

Tôi không chắc liệu tôi có hiểu vấn đề cụ thể của bạn hay không. Không phải 'Người dùng' đã có thuộc tính 'Danh sách ' mà bạn có thể lặp lại trong một vòng lặp lồng nhau? – BalusC

+0

@EricG Tôi rõ ràng không thể làm điều đầu tiên bạn đề xuất và cho đề xuất thứ hai của bạn, tôi sẽ thử. Xin lỗi, tôi không thể trả lời cho đến bây giờ. – aslan

Trả lời

1

Nếu tôi hiểu cách bố trí của dữ liệu của bạn một cách chính xác, bạn có một cái gì đó như thế này:

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

Nếu đó là trường hợp, bạn có thể cấu trúc đối tượng người dùng của bạn như thế này:

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

và truy vấn của bạn sẽ chỉ cần thực hiện một phép nối trái trên UserPosition được đánh dấu là "chính". UserPosition đó sau đó sẽ tham gia vào đúng vị trí. Sau đó, JSP của bạn sẽ chỉ cần kiểm tra xem đối tượng Vị trí của bạn có trống không.

<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> 
Các vấn đề liên quan