Java Hibernate:获取子类的属性
我正在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
@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();