Настоящая проблема - сама коллекция.Вы должны не моделировать бизнес-домен таким образом.Это решение (для коллекций, помеченных @OneToMany
) применимо только для небольших коллекций (десятки объектов), но не для больших (тысячи объектов), что вполне может быть в случае с комментариями.Вы действительно должны остерегаться с ними, поскольку они могут быстро выйти из-под контроля.В настоящее время я использую их только для моделирования коллекции Role
s, связанной с Account
, потому что я знаю, что ни одна учетная запись не будет иметь более 9 ролей в моем домене, и потому что роли, в которых находится учетная запись, таковы.очень важно для работы с учетной записью.Для всех других отношений m-to-n я использую простые старые запросы.
Вместо добавления коллекции комментариев к вашему объекту, добавьте ссылку на объект в Comment
и явно получите комментарии, которые вы хотите, используя запрос.
Определите именованный запрос на Comment
, чтобы получить комментарии для определенного объекта (давайте используем 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;
}
Тогдаиспользуйте этот именованный запрос icw Query.setMaxResults и Query.setFirstResult , чтобы явно контролировать, сколько результатов получить и разрешить подкачку и т. д .:
@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();
Для выполненияпейджинг, просто setFirstResult
до первого результата, соответствующего странице, которую вы хотите отобразить.Например, чтобы показать результаты 20 .. 29, вы бы позвонили setFirstResult(20)
.