【问题标题】:Exclude Loading of specific properties in Hibernate object排除在 Hibernate 对象中加载特定属性
【发布时间】:2013-01-20 00:24:36
【问题描述】:

我有一个实体类

class B{
    @ManyToOne(fetch = FetchType.EAGER)
    private A a;
    @ManyToOne(fetch = FetchType.LAZY)
    private C c;

}

在某些情况下,我不想加载对象 A,因为我已经拥有该对象。 C 也一样。但这些是我根本不想加载这些对象的特定场景。

有什么方法可以告诉hibernate不要加载实体对象的某些属性。 {没有 Eager/Fetch 建议。我只是希望这仅在特定情况下发生]

注意:我现在正在使用 Criteria 获取对象。

【问题讨论】:

    标签: java hibernate entity criteria


    【解决方案1】:

    由于您使用HQL 进行查询,因此您可以使用“fetch”关键字根据您的条件指定您的fetching strategy at runtime,如下所示:

    List result = sess.createCriteria(B.class)
        .add( Restrictions.like("name", "yourcondition%") )
        .setFetchMode("a", FetchMode.EAGER)
        .setFetchMode("c", FetchMode.LAZY)
        .list();
    

    编辑:

    由于不推荐使用 FetchMode.EAGER 和 FetchMode.LAZY,因此 FetchMode.SELECT 或 FetchMode.JOIN

    List result = sess.createCriteria(B.class)
        .add( Restrictions.like("name", "yourcondition%") )
        .setFetchMode("a", FetchMode.JOIN)
        .setFetchMode("c", FetchMode.SELECT)
        .list();
    

    如果你想避免 SELECT 或 JOIN 检查here

    【讨论】:

    • 你能根据我的班级修改你的例子吗?对不起,我很困惑;)
    • 我变了。 “我只是希望这仅在特定情况下发生”-您的特定情况是什么样的
    • 我可能正在使用 A 对象检索 B 对象,在这种情况下,我不需要在 B 实体中加载 A 对象。
    • 我已经这样做了 criteria = getSession().createCriteria(B.class).setFetchMode("a", FetchMode.LAZY)返回条件.list();仍然得到一个对象
    • 我在网上读过/看过帖子说 EAGER 对象不能被 LAZY 加载,但是 LAZY 对象可以动态加载
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2018-10-03
    • 1970-01-01
    • 1970-01-01
    • 2019-07-27
    • 1970-01-01
    相关资源
    最近更新 更多