Java Hibernate:获取子类的属性

Java Hibernate:获取子类的属性,java,mysql,hibernate,Java,Mysql,Hibernate,我正在Java项目中使用Hibernate连接到数据库。我有以下课程: @Entity @Table(name = "a") @Inheritance(strategy = InheritanceType.JOINED) public abstract class A { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id", nullable = false) pr

我正在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);

你知道我做错了什么吗?

如果你有一个字段集
FetchType.LAZY
,并且你想在一个特定的查询中快速获取它,那么你有两个选择:

1. 最简单的方法就是正常查询并迭代结果以强制hibernate获取嵌套字段

List<Class> result = session.createCriteria(persistentClass).list();
for(Class c : result)
c.getLazyField();
List result=session.createCriteria(persistentClass.List();
对于(c类:结果)
c、 getLazyField();
2.困难的是,如果您有一些特殊要求,必须在DB级别上只运行一个查询,那么您需要手动获取一个cursos和fecth每个字段。

当您将字段设置为惰性时,无论hibernate是否在结果集上看到它,它都会简单地忽略,因为它被注释为惰性。

如果我理解,您将一个字段设置为惰性,并且希望在一个特定查询中立即获取它。。。最简单的方法就是正常查询并迭代结果以强制hibernate获取嵌套字段。
List<Class> result = session.createCriteria(persistentClass).list();
for(Class c : result)
c.getLazyField();