一尘不染

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

hibernate

如果我在使用JPA /hibernate注释的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)?

请注意,该问题使用Criteria或以任何其他方式以编程方式限制显式查询的大小,从而显式地指向POJO映射,而不进行其他查询。

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


阅读 335

收藏
2020-06-20

共1个答案

一尘不染

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

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

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

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

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

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

  • HQL / JPQL
  • 标准
  • 本机SQL
2020-06-20