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

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

@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 映射,而不是进行其他查询,使用条件或任何其他方式以编程方式限制显式查询中的大小。

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


答案 1

这是不可能的。休眠有两个选项供您选择:

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

没有中间地带。这是因为 Hibernate 需要管理整个集合实体状态转换。如果你能够加载子集,那么单向包就没有多大意义了。

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

因此,您必须始终记住[休眠集合是一项功能,而不是强制性要求。查询更加灵活,限制更少。

因此,这次必须使用查询:

  • HQL/JPQL
  • 标准
  • 本机 SQL

答案 2

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

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

推荐