【问题标题】:Hibernate how to change eager, select, batch to lazy load in hibernate criteriaHibernate 如何在休眠条件中将渴望、选择、批处理更改为延迟加载
【发布时间】:2020-04-16 10:28:28
【问题描述】:

我有很多 OneToMany 关系,在大多数情况下需要像这样急切地加载:

@OneToMany(fetch = FetchType.EAGER, mappedBy = "bar")
@Fetch(FetchMode.SELECT)
@BatchSize(size = 10)

但是,在极少数情况下,我需要在休眠条件中将其更改为延迟加载(仍然是选择和批处理)。但我不知道该怎么做。 当我尝试here 的解决方案时 -

criteria.setFetchMode("propertyName", FetchMode.SELECT);

它仍然急切地加载。

我的标准现在看起来像这样:

Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Bar.class);
criteria.add(Restrictions.eq("valid", true));
criteria.add(Restrictions.idEq(barId));
Bar result = (Bar) criteria.uniqueResult();

这里是实体,仅用于说明目的...

@Entity
@Table(name = "BAR", schema = "UD")
public class Bar {
    private List<Foo> foos;

    @OneToMany(fetch = FetchType.EAGER, mappedBy = "bar")
    @Fetch(FetchMode.SELECT)
    @BatchSize(size = 10)
    public List<Foo> getFoos() {
        return foos;
    }
}

我正在使用 Hibernate 5.1.10.Final

【问题讨论】:

    标签: java hibernate jpa criteria


    【解决方案1】:

    我不知道是否可以进行按需获取,但有一种可用的技术,您可以使用自定义查询中的构造函数获取 Bar 对象:

    @Query("SELECT new BAR( &lt;add other required fields except FOOs&gt; ) from BAR")

    注意:这与 LAZY 加载不同。如果您需要Foo,则必须再次拨打数据库电话。

    【讨论】:

    • 您好,感谢您的有趣提示。有时我确实需要它。此外,实体真的很大,有很多这样的关系(我对此无能为力),创建这样的查询将非常不清楚。现在,我实际上正在为具有不同注释的同一个表使用另一个实体,但我希望有该选项可以更轻松地在标准中切换它。谢谢。
    猜你喜欢
    • 2016-05-02
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    • 2015-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多