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需要管理整个集合实体状态转换。如果您能够加载子集,那么单向包就没有多大意义。
虽然可以使用
因此,您必须始终记住[hibernate集合是一项功能,而不是强制性要求。查询更灵活,限制更少。
因此,您这次必须使用查询:
- HQL / JPQL
- 标准
- 本机SQL
您可以通过使用"自定义"联接表名称来限制条目的数量,如下所示:
1 | @JoinTable(name ="(select * from the_table order by some_column limit 10)") |