我试图优化模式创建端点的调用数量,并摆脱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=?
为什么会这样,有没有办法避免呢?
先谢了。
1条答案
按热度按时间rkkpypqq1#
Hibernate无法延迟获取
ToOne
关系。A
中的b
字段可以为空,在确认用空值填充该字段之前,hib必须检查表b
。您可以考虑使用
@MapsId
,例如:您可以在这里阅读更多关于
@MapsId
的信息:https://www.objectdb.com/api/java/jpa/MapsId