是否可以使用 Hibernate 或 JPA Annotations 限制 @OneToMany 集合的大小?

Posted

技术标签:

【中文标题】是否可以使用 Hibernate 或 JPA Annotations 限制 @OneToMany 集合的大小?【英文标题】:Is it possible to limit the size of a @OneToMany collection with Hibernate or JPA Annotations? 【发布时间】:2014-12-07 07:42:42 【问题描述】:

如果我在使用 JPA/Hibernate Annotations 的 POJO 中有以下映射集合:

@OneToMany(mappedBy = "columnName", fetch = FetchType.LAZY)
@OrderBy("aField")
@MapKeyJoinColumn(name = "id_fk")
@LazyCollection(value = LazyCollectionOption.EXTRA)
private Set<PojoClass> collection = new HashSet<>();

是否可以将加载集合的大小限制为特定数字 n 或将页面大小设置为延迟加载集合的前 n 个元素,而不加载所有项目或来自该类的其他实例的任何其他项目(比如@BatchSize)?

请注意,该问题明确提到 POJO 映射,而不是进行额外查询,使用 Criteria 或任何其他方式以编程方式限制显式查询的大小。

我一直在寻找的可能解决方案是在 Hibernate 中找到 SQL TOP 语句的实现,希望作为注释或创建自定义 CollectionPersister 来修改生成的查询(尽管这需要在支持的方言)。

【问题讨论】:

【参考方案1】:

这是不可能的。 Hibernate 有两种选择:

在获取父实体时加载子集合 您在首次访问时懒惰地加载儿童集合

没有中间立场。那是因为 Hibernate 需要管理整个集合实体的状态转换。如果您能够加载子集,那么单向袋将没有多大意义。

虽然您可以使用@Where@Filter,但这些注释对于过滤出集合的内容更有用,而不是限制其大小。

因此,您必须始终记住 [Hibernate 集合是一项功能,not a mandatory requirement。查询更加灵活,限制更少。

所以,这次你必须使用查询:

HQL/JPQL 标准 本机 SQL

【讨论】:

更新了“持久集合是一项功能!”的链接:in.relation.to/2006/01/26/persistent-collections-are-a-feature【参考方案2】:

您可以通过使用“自定义”连接表名称来限制条目数量,如下所示:

@JoinTable(name = "(select * from the_table order by some_column limit 10)")

【讨论】:

哇,这是一种创造性的方法:-D

以上是关于是否可以使用 Hibernate 或 JPA Annotations 限制 @OneToMany 集合的大小?的主要内容,如果未能解决你的问题,请参考以下文章

JPA/Hibernate 和复合键

JPA 或 Hibernate 生成(非主键)列值,不是从 1 开始

直接加入 JPA 或 HIBERNATE

要使用的Hibernate或JPA注释

如何使用 Hibernate (EntityManager) 或 JPA 调用 Oracle 函数或过程

从 Hibernate 标准到 JPA 标准或 QueryDSL