@OneToMany映射列表大小限制

2022-09-03 05:17:29

有没有办法限制 JPA 中@OneToMany关系的列表大小?这是我的代码示例:

@OneToMany(mappedBy = "publication", cascade=CascadeType.PERSIST)
private List<Comment> commentList;

我正在使用EclipseLink 2.3 JPA实现。提前致谢。


答案 1

Bean 验证规范 (JSR-303) 的一部分是注释:@Size(min=, max=)

支持的类型包括字符串、集合、映射和数组。检查带注释的元素大小是否介于最小值和最大值(含)之间。

您可以验证集合。

@OneToMany(mappedBy = "publication", cascade=CascadeType.PERSIST)
@Size(min=1, max=10)
private List<Comment> commentList;

答案 2

真正的问题是集合本身。您不应以这种方式对业务领域进行建模。此解决方案(使用 注释的集合)仅适用于小型集合(数十个对象),而不适用于大型集合(数千个对象),注释很可能就是这种情况。你真的必须小心他们,因为他们很快就会失控。我目前只使用它们来模拟与 a 关联的 s 集合,因为我知道在我的域中,没有一个帐户将有超过 9 个角色,并且因为帐户所在的角色对于使用帐户非常重要。对于所有其他 m 到 n 关系,我使用的是普通的旧查询。@OneToManyRoleAccount

不要向对象添加注释集合,而是添加对对象的引用,并使用查询显式获取所需的注释。Comment

定义一个命名查询 on 以获取某个对象的注释(让我们使用):CommentArticle

@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;
}

然后,使用该命名查询 i.c.w. Query.setMaxResultsQuery.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();

要执行分页,只需找到与要显示的页面对应的第一个结果。例如,显示结果 20 ..29,你会打电话。setFirstResultsetFirstResult(20)


推荐