Vấn đề thực sự là chính bộ sưu tập. Bạn nên không phải mô hình miền doanh nghiệp của mình theo cách này. Giải pháp này (của các bộ sưu tập chú thích với @OneToMany
) chỉ khả thi đối với các bộ sưu tập nhỏ (hàng chục đối tượng) và không cho các bộ sưu tập lớn (hàng nghìn đối tượng) có thể là trường hợp có nhận xét. Bạn thực sự phải xem với họ khi họ có thể nhanh chóng phát triển ngoài tầm kiểm soát. Hiện tại, tôi đang sử dụng chúng để mô hình hóa bộ sưu tập của Role
được liên kết với một số Account
, bởi vì tôi biết rằng sẽ không có tài khoản nào có hơn 9 vai trò trong miền của tôi và vì vai trò của tài khoản là rất quan trọng để làm việc với tài khoản. Đối với tất cả các quan hệ m-to-n khác, tôi đang sử dụng các truy vấn cũ đơn giản.
Thay vì thêm bộ sưu tập nhận xét vào đối tượng của bạn, hãy thêm tham chiếu đến đối tượng trên Comment
và rõ ràng nhận các nhận xét bạn muốn bằng truy vấn.
Xác định một truy vấn có tên trên Comment
để có được những cảm nhận cho một đối tượng nào đó (chúng ta hãy sử dụng Article
):
@Entity
@NamedQueries(value={
@NamedQuery(name=Comment.FOR_ARTICLE, query=
"SELECT c FROM Comment c WHERE c.article = :article"
)
})
public class Comment {
// ...
@ManyToOne
@JoinColumn(name = "articleId")
private Article article;
}
Sau đó, sử dụng mà tên i.c.w. truy vấn Query.setMaxResults và Query.setFirstResult để dứt khoát kiểm soát có bao nhiêu kết quả để có được và cho phép phân trang vv:
@PersistenceContext
EntityManager em;
Article theArticle = ...;
Query query = em.createNamedQuery(Comment.FOR_ARTICLE, Comment.class);
query.setParameter("article", theArticle);
query.setFirstResult(0);
query.setMaxResults(10);
List<Comment> comments = (List<Comment>) query.getResultList();
Để làm phân trang, chỉ cần setFirstResult
đến kết quả đầu tiên tương ứng với trang web mà bạn muốn hiển thị. VÍ DỤ. để hiển thị kết quả 20 .. 29, bạn sẽ gọi setFirstResult(20)
.
Nguồn
2015-11-16 10:31:39
có thể trùng lặp của [Sử dụng chú thích trong JPA tôi có thể giới hạn bản ghi con với mệnh đề where?] (Http://stackoverflow.com/questions/5857936/using-annotations-in-jpa-can-i-limit-child -records-with-a-where-clause) –
Bài đăng này muốn hạn chế số lượng phần tử được duy trì, trong khi bài đăng được liên kết muốn truy xuất các phần tử cũng có một số tiêu chí khác. Do đó không phải là "trùng lặp chính xác". – DataNucleus