Hibernate使用原生查询急切地加载Lazy实体

dwbf0jvd  于 2023-02-19  发布在  其他
关注(0)|答案(1)|浏览(112)

我试图优化模式创建端点的调用数量,并摆脱n +1问题。实际上,我只用2次调用就完成了。我用命名查询实现了这一点,但我想知道是否可以用nativeQuery=true实现这一点。因此,情况如下:
A类:

@Entity
@IdClass(AId.class)
@Table(name ="A")
@Data
class A implements Serializable{
 @Id
 @Column(name = "ID")
 private Integer id;

// code omitted...

@ManyToOne(fetch=FetchType.Lazy)
@JoinColumns(
    ...
)
private B b;

}

B类:

@Entity
@IdClass(AId.class)
@Table(name ="B")
@Data
class B implements Serializable{
 @Id
 @Column(name = "ID")
 private Integer id;

// code omitted...

@OneToMany(mappedBy="b", cascade=Cascade.ALL, fetch=FetchType.Lazy)
@JoinColumns(
    ...
)
private List<A> aList;

}

当我尝试用生成的或原生的查询来获取数据时,这个问题就出现了。当我获取A时,它获取了B实体,尽管它对A来说是Lazy的。
预期行为是执行查询,如下所示:

Hibernate:
    /* dynamic native SQL query */ SELECT
        *
    FROM
        A a
    WHERE
        a.ID IN (
            ?
        )

但紧接着(不管我如何处理动态原生查询),我还有一个不需要的B实体查询:

Hibernate:
    /* load com.example.to.B */ select
        b0_.id as id1_1_0_,
    from
        B b0_
    where
        b0_.id=?

为什么会这样,有没有办法避免呢?
先谢了。

rkkpypqq

rkkpypqq1#

Hibernate无法延迟获取ToOne关系。
A中的b字段可以为空,在确认用空值填充该字段之前,hib必须检查表b
您可以考虑使用@MapsId,例如:

@ManyToOne
@MapsId(“id”) 
private B b;

您可以在这里阅读更多关于@MapsId的信息:https://www.objectdb.com/api/java/jpa/MapsId

相关问题