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

Is it possible to limit the size of a @OneToMany collection with Hibernate or JPA Annotations?

如果我使用JPA /hibernate注释在POJO中具有以下映射的集合:

1
2
3
4
5
@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来修改生成的查询(尽管这需要在支持的范围内实现TOP语句方言)。


那是不可能的。 Hibernate为您提供了两种选择:

  • 您在获取父实体时加载子对象集合
  • 您在第一次访问时会懒惰地加载子级集合

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

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

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

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

  • HQL / JPQL
  • 标准
  • 本机SQL


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

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