如果我在使用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语句)。
那不可能 Hibernate为您提供了两种选择:
没有中间立场。这是因为Hibernate需要管理整个集合实体状态转换。如果您能够加载子集,那么单向袋就没有多大意义。
尽管可以使用@Where或@Filter,但是这些注释对于过滤集合的内容(而不是限制其大小)更加有用。
@Where
@Filter
因此,您必须始终记住,Hibernate集合是一项功能,而不是强制性要求。查询更加灵活,限制更少。
因此,这次您必须使用查询: