繁体   English   中英

Hibernate:在子类上获取属性

[英]Hibernate: Fetch property on subclass

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

有什么想法我做错了吗?

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

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

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

2.困难的方法是,如果您有一些特殊要求,即您只能在数据库级别上运行一个查询,则您将需要手动获得每个对象的权限并使用每个字段。
当您将字段设置为惰性时,无论休眠状态是否在结果集上看到它,都将被忽略,因为它被注释为。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM