@OneToMany映射列表大小限制
2022-09-03 05:17:29
有没有办法限制 JPA 中@OneToMany关系的列表大小?这是我的代码示例:
@OneToMany(mappedBy = "publication", cascade=CascadeType.PERSIST)
private List<Comment> commentList;
我正在使用EclipseLink 2.3 JPA实现。提前致谢。
有没有办法限制 JPA 中@OneToMany关系的列表大小?这是我的代码示例:
@OneToMany(mappedBy = "publication", cascade=CascadeType.PERSIST)
private List<Comment> commentList;
我正在使用EclipseLink 2.3 JPA实现。提前致谢。
Bean 验证规范 (JSR-303) 的一部分是注释:@Size(min=, max=)
支持的类型包括字符串、集合、映射和数组。检查带注释的元素大小是否介于最小值和最大值(含)之间。
您可以验证集合。
@OneToMany(mappedBy = "publication", cascade=CascadeType.PERSIST)
@Size(min=1, max=10)
private List<Comment> commentList;
真正的问题是集合本身。您不应以这种方式对业务领域进行建模。此解决方案(使用 注释的集合)仅适用于小型集合(数十个对象),而不适用于大型集合(数千个对象),注释很可能就是这种情况。你真的必须小心他们,因为他们很快就会失控。我目前只使用它们来模拟与 a 关联的 s 集合,因为我知道在我的域中,没有一个帐户将有超过 9 个角色,并且因为帐户所在的角色对于使用帐户非常重要。对于所有其他 m 到 n 关系,我使用的是普通的旧查询。@OneToMany
Role
Account
不要向对象添加注释集合,而是添加对对象的引用,并使用查询显式获取所需的注释。Comment
定义一个命名查询 on 以获取某个对象的注释(让我们使用):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;
}
然后,使用该命名查询 i.c.w. 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();
要执行分页,只需找到与要显示的页面对应的第一个结果。例如,显示结果 20 ..29,你会打电话。setFirstResult
setFirstResult(20)