@OneToMany映射列表大小限制

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

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

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

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

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

您可以validation该集合。

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

你不能在JPA中做到这一点并且它没有意义,因为映射旨在反映关系中有多少对象的现实。

你是否因为表现而这样做? 如果是这样,您可以使用Lazy fetch样式并使用Batchsize注释来指定要获取一次的数量:

* 更正:@Batchsize是一个Hibernatefunction

 @OneToMany(mappedBy = "publication", cascade=CascadeType.PERSIST, fetch=LAZY) @BatchSize(size=16) private List commentList; 

然后在您的代码中,只需迭代/循环到此映射集合中您想要的位置。

无论哪种方式,从我的经验“黑客”映射到做什么Criterias / Querys的设计并不是一项富有成效的尝试,当你需要比@OneToMany明确提供的更多控制或性能调整时,最好的方法可能就是制作一个查询。

真正的问题是集合本身。 您不应该以这种方式为您的业务域建模。 这个解决方案(使用@OneToMany注释的集合)仅适用于小型集合(数十个对象),而不适用于大型集合(数千个对象),这些可能就是注释的情况。 你真的要注意他们,因为他们很快就会失去控制。 我目前正在使用它们来模拟与Account关联的Role集合,因为我知道在我的域中任何帐户都不会有超过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 comments = (List) query.getResultList(); 

要进行分页,只需将setFirstResult设置为与要显示的页面对应的第一个结果。 EG显示结果20 .. 29,你会调用setFirstResult(20)

没有真正的正统方式这样做。 我会使关系变得懒惰,查询父对象。 病毒之后不要初始化惰性列表,并根据第一个查询运行另一个查询,该查询在子表上运行。 这样,您可以在主要条件上限制结果集,而不是在连接条件上。 或者,您可以仅使用分页支持运行第二个查询(仅在子表上)。