为select生成hibernate sql
我有两个实体,一个叫natureza,另一个叫subnatureza为select生成hibernate sql,hibernate,jpa,spring-boot,Hibernate,Jpa,Spring Boot,我有两个实体,一个叫natureza,另一个叫subnatureza @Entity(name = "natureza") @SuppressWarnings("serial") public class Natureza extends AbstractEntity{ String nome; @JoinColumn(name="natureza_id") @JsonIgnore private Set<SubNatureza> subNat
@Entity(name = "natureza")
@SuppressWarnings("serial")
public class Natureza extends AbstractEntity{
String nome;
@JoinColumn(name="natureza_id")
@JsonIgnore
private Set<SubNatureza> subNaturezas;
}
@Entity
@Table(name = "sub_natureza")
public class SubNatureza extends AbstractEntity{
private String nome;
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
}
@实体(name=“natureza”)
@抑制警告(“串行”)
公共类Natureza扩展了AbstractEntity{
字符串名称;
@JoinColumn(name=“natureza_id”)
@杰索尼奥雷
私有集子网;
}
@实体
@表(name=“sub_natureza”)
公共类SubNatureza扩展了AbstractEntity{
私有字符串名称;
公共字符串getNome(){
返回nome;
}
公共无效集合名称(字符串名称){
this.nome=nome;
}
}
在我的natureza表格中,我有5行,在subnatureza表格中有10行(每个natureza有2行)
所以当我运行NaturezaRepository.findAll()时;hibernate在控制台中为每个natureza在subnatureza中显示一个选择(在我的示例中为5个选择)
对吗?因为如果在我的数据库中,我只运行:
选择*from natureza n JOIN sub_natureza s ON n.id=s.natureza_id一次
当您尝试
NaturezaRepository.findAll()时,tks处于休眠状态代码>您实际上正在尝试
Select * from natureza n
当您以本机查询的形式运行这是Mysql时,它将给您5条记录,这也是Hibernate所做的。那么回答你的问题,这是正确的吗?是的
NaturezaRepository.findAll();hibernate在控制台中为每个natureza在subnatureza中显示一个选择(在我的示例中为5个选择)
因此,您总共看到6个查询,这是一个典型的n+1问题。
您可以在NaturezaRepository
上的findAll
方法上使用。如果NaturezaRepository
中还没有方法,则创建findAll()
方法
@EntityGraph(attributePaths = {"subNaturezas"})
Page<Natureza> findAll()
@EntityGraph(attributePath={“subNaturezas”})
页码findAll()
另一个选项是在findAll
方法之上使用