@OneToMany映射列表大小限制

gus*_*gus 13 java jpa one-to-many

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

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

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

jeh*_*eha 19

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

支持的类型是String,Collection,Map和数组.检查带注释的元素大小是否在最小值和最大值(包括)之间.

您可以验证该集合.

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


Sti*_*itt 5

真正的问题是集合本身。您应该以这种方式对您的业务领域进行建模。此解决方案(用 注释的集合@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;
}
Run Code Online (Sandbox Code Playgroud)

然后,使用命名查询 icw 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();
Run Code Online (Sandbox Code Playgroud)

进行分页时,只需setFirstResult到与您要显示的页面对应的第一个结果即可。EG 要显示结果 20 .. 29,您可以调用 setFirstResult(20).