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

时间:2014-10-12 17:53:15

标签: java performance hibernate jpa hibernate-mapping

如果我使用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来修改生成的查询(尽管这需要在其中实现TOP语句支持的方言)。

2 个答案:

答案 0 :(得分:39)

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

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

没有中间立场。这是因为Hibernate需要管理整个集合entity state transitions。如果你能够加载子集,那么单向包就没有多大意义。

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

所以,你必须永远记住Hibernate collections are a feature, not a mandatory requirement。查询更灵活,限制更少。

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

  • HQL / JPQL
  • 标准
  • 原生SQL

答案 1 :(得分:3)

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

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