【问题标题】:Hibernate: Fetch property on subclassHibernate:获取子类的属性
【发布时间】:2018-07-20 00:23:20
【问题描述】:

我在 Java 项目中使用 Hibernate 来连接数据库。我有以下课程:

@Entity
@Table(name = "a")
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class A {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", nullable = false)
    private Long id;
}

@Entity
@Table(name = "b")
public class B extends A {
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "c_id", nullable = false)
    private C c;
}

@Entity
@Table(name = "c")
public class C {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", nullable = false)
    private Long id;
}

我正在尝试对 A 编写一个查询,该查询将急切地在 B 中获取 C。我尝试这样做:

CriteriaBuilder builder = session.getCriteriaBuilder();

CriteriaQuery<A> criteria = builder.createQuery(A.class);
Root<Pin> root = criteria.from(A.class);
criteria.select(root);

builder.treat(root, B.class).fetch("c", JoinType.LEFT);

但它不会执行提取。奇怪的是,我能够成功地执行以下操作来进行左连接:

Join c = builder.treat(root, B.class).join("c", JoinType.LEFT);

任何想法我做错了什么?

【问题讨论】:

  • 如果我明白,你有一个字段设置为 lazy 并且你希望它在一个特定的查询中被急切地获取......最简单的方法是正常查询并迭代结果强制休眠获取嵌套字段。

标签: java mysql hibernate


【解决方案1】:

如果您有一个字段集 FetchType.LAZY,并且您希望在一个特定查询中急切获取它,您有两种选择:

1. 最简单的方法就是正常查询并遍历结果以强制休眠获取嵌套字段。

List<Class> result = session.createCriteria(persistentClass).list();
for(Class c : result)
c.getLazyField();

2. 困难的方法是,如果您有一些特殊要求,您必须在数据库级别只运行一个查询,您将需要手动获取光标并检查每个字段。
当您将该字段设置为惰性时,无论休眠是否在结果集中看到它,它都会简单地忽略,因为它已被注释为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-16
    • 1970-01-01
    • 1970-01-01
    • 2012-07-16
    • 2020-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多