【问题标题】:Hibernate: Limit result size of child objects休眠:限制子对象的结果大小
【发布时间】:2021-08-03 00:26:49
【问题描述】:

我有一个父实体,它有许多子对象,其中大部分是集合。见下文。

@Entity
@Table(name = "A")
public class A {

    @Id
    @Column(name = "ID")
    private long id;

    @OneToMany(cascade = {CascadeType.ALL}, fetch = FetchType.EAGER)
    @JoinColumn(name = "A_ID", nullable = false)
    private Set<B> setB;

    @OneToMany(cascade = {CascadeType.ALL}, fetch = FetchType.EAGER)
    @JoinColumn(name = "A_ID", nullable = false)
    private Set<C> setC;

    @OneToMany(cascade = {CascadeType.ALL}, fetch = FetchType.EAGER)
    @JoinColumn(name = "A_ID", nullable = false)
    private Set<D> setD;

    // Skipping more collections as they are not needed for the example
    // Standard getters and setters
    
}

现在classes B、C 和 D 有 A_ID 和另外 5 个String 列。请考虑他们 B1,B2,B3,B4,B5 等等。 我还有一个 A 的 CrudRepository

@Repository
public interface ARepository extends CrudRepository<A, Long> {
    Optional<A> findById(Long id);
}

我想获取带有 id 的完整 A 对象,但 A 拥有的其他子集合(setB、setC、setD)包含每个 A_ID 的大约数千行。我想放置一个过滤器以仅获取给定 A_ID 的前 100 行。 我尝试将@Where(clause = "ROWNUM &lt; 101") 放在集合上,但它不起作用,因为在查询中表名以ROWNUM 为前缀。 我还查看了CriteriaCriterion,但我找不到任何可行的解决方案。 由于父类中有很多Objects 的集合。因此,对每个对象使用本机查询将带来太多的返工。 谁能帮我解决这个问题。如果您需要更多信息,请发表评论。 谢谢

【问题讨论】:

  • 您好,不清楚的是您只需要 100 行的原因...您是否要解决性能问题?
  • 你好@Sixro-它更像是一个 GUI 的东西。用户只想要前 100 个对象。而且其中一些收藏品有数百万件物品,因此不可能展示所有物品。用户同意
  • 谢谢 Chitransh,很遗憾我帮不了你。我知道的唯一解决方案是从 FetchType.EAGER 切换到 LAZY 并减少批量大小,只加载您需要的孩子数量......但我认为你不想对所有其他用例产生影响......
  • 是的,这不能解决我的问题,但感谢您查看

标签: java spring-boot hibernate hql


【解决方案1】:

这并不容易。您必须手动获取集合或使用顶部的 Blaze-Persistence Entity-Views 之类的库,该库支持开箱即用。另请参阅此处了解类似问题:Hibernate - Limit size of nested collection

在您的特定情况下,这可能如下所示:

@EntityView(A.class)
public interface ADto {

    @IdMapping
    long getId();

    @Limit(limit = "100", order = "id asc")
    Set<BDto> getSetB();

    @Limit(limit = "100", order = "id asc")
    Set<C> getSetC();

    @Limit(limit = "100", order = "id asc")
    Set<D> getSetD();
    
}

【讨论】:

  • 抱歉回复晚了。谢谢您的答复。不幸的是,由于某些限制,我将无法使用该库,但是查看参考问题我得到了我想要的,我没有使用它,但我肯定会看一些参考资料。非常感谢您的宝贵时间
  • 我尝试与管理层交谈,但我们无法让图书馆为我们这样做。但是有什么方法可以省略一些集合,然后我们可以使用原生查询来获取它
  • 不,没有 Blaze-Persistence,没有其他方法可以做到这一点。您必须单独获取集合并将它们填充到 DTO 中。
猜你喜欢
  • 2011-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-02
  • 1970-01-01
  • 2015-04-27
相关资源
最近更新 更多