Hibernate或JPA注释可以限制@OneToMany集合的大小吗?

40

假设我在一个POJO中使用JPA/Hibernate注解来映射以下集合:

@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语句)。

2个回答

74

那是不可能的。Hibernate有两个选项供您选择:

  • 在获取父实体时加载子集合
  • 首次访问时惰性地加载子集合

没有中间状态。这是因为Hibernate需要管理整个集合实体状态转换。如果您能够加载子集,则单向包将毫无意义。

虽然您可以使用@Where@Filter,但这些注释更适用于筛选集合内容,而不是限制其大小。

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

因此,您必须使用以下查询方式:

  • HQL / JPQL
  • Criteria
  • 本地SQL

1
“Persistent collections are a feature!” 的更新链接:https://in.relation.to/2006/01/26/persistent-collections-are-a-feature/ - gorlok

14

您可以通过使用“自定义”联接表名称来限制条目的数量,方法如下:

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

3
哇,这是一个有创意的方法 :-D - Marcus K.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接