是否可以使用 Hibernate 或 JPA Annotations 限制 @OneToMany 集合的大小?
Posted
技术标签:
【中文标题】是否可以使用 Hibernate 或 JPA Annotations 限制 @OneToMany 集合的大小?【英文标题】:Is it possible to limit the size of a @OneToMany collection with Hibernate or JPA Annotations? 【发布时间】:2014-12-07 07:42:42 【问题描述】:如果我在使用 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 来修改生成的查询(尽管这需要在支持的方言)。
【问题讨论】:
【参考方案1】:这是不可能的。 Hibernate 有两种选择:
在获取父实体时加载子集合 您在首次访问时懒惰地加载儿童集合没有中间立场。那是因为 Hibernate 需要管理整个集合实体的状态转换。如果您能够加载子集,那么单向袋将没有多大意义。
虽然您可以使用@Where
或@Filter
,但这些注释对于过滤出集合的内容更有用,而不是限制其大小。
因此,您必须始终记住 [Hibernate 集合是一项功能,not a mandatory requirement。查询更加灵活,限制更少。
所以,这次你必须使用查询:
HQL/JPQL 标准 本机 SQL【讨论】:
更新了“持久集合是一项功能!”的链接:in.relation.to/2006/01/26/persistent-collections-are-a-feature【参考方案2】:您可以通过使用“自定义”连接表名称来限制条目数量,如下所示:
@JoinTable(name = "(select * from the_table order by some_column limit 10)")
【讨论】:
哇,这是一种创造性的方法:-D以上是关于是否可以使用 Hibernate 或 JPA Annotations 限制 @OneToMany 集合的大小?的主要内容,如果未能解决你的问题,请参考以下文章
JPA 或 Hibernate 生成(非主键)列值,不是从 1 开始