estou tentando fazer apenas 1 consulta, que possa trazer todas as minhas de uma unica vez, ex: Tenho uma tabela de Carro e modeloCarro, vejamos que ele faz varias vezes select no modelo carro, como faço para melhorar essa forma de consulta?
@Test
public void exemploJoinFect(){
CriteriaBuilder builder = manager.getCriteriaBuilder();
CriteriaQuery<Carro> criteriaQuery = builder.createQuery(Carro.class);
Root<Carro> carro = criteriaQuery.from(Carro.class);
TypedQuery<Carro> query = manager.createQuery(criteriaQuery);
Join<Carro, ModeloCarro> modeloCarro = (Join) carro.fetch("modeloCarro"); //Já traz as propriedados do modeloCarro
List<Carro> carros = query.getResultList();
for(Carro c : carros){
System.out.println(c.getAno() +" -" + c.getModeloCarro().getNome());
}
}
Log da Consulta.
Hibernate:
select
carro0_.codigo as codigo1_0_,
carro0_.ano as ano2_0_,
carro0_.cor as cor3_0_,
carro0_.codigo_modeloCarro as codigo_m5_0_,
carro0_.placa as placa4_0_
from
Carro carro0_
Hibernate:
select
modelocarr0_.codigo as codigo1_4_0_,
modelocarr0_.categoria as categori2_4_0_,
modelocarr0_.codigo_fabricante as codigo_f4_4_0_,
modelocarr0_.nome as nome3_4_0_
from
modelo_carro modelocarr0_
where
modelocarr0_.codigo=?
2010 -Corolla XEI
Hibernate:
select
modelocarr0_.codigo as codigo1_4_0_,
modelocarr0_.categoria as categori2_4_0_,
modelocarr0_.codigo_fabricante as codigo_f4_4_0_,
modelocarr0_.nome as nome3_4_0_
from
modelo_carro modelocarr0_
where
modelocarr0_.codigo=?
2001 -Hilux
2121 -Corolla XEI
Hibernate:
select
modelocarr0_.codigo as codigo1_4_0_,
modelocarr0_.categoria as categori2_4_0_,
modelocarr0_.codigo_fabricante as codigo_f4_4_0_,
modelocarr0_.nome as nome3_4_0_
from
modelo_carro modelocarr0_
where
modelocarr0_.codigo=?
2006 -Frontier
Hibernate:
select
modelocarr0_.codigo as codigo1_4_0_,
modelocarr0_.categoria as categori2_4_0_,
modelocarr0_.codigo_fabricante as codigo_f4_4_0_,
modelocarr0_.nome as nome3_4_0_
from
modelo_carro modelocarr0_
where
modelocarr0_.codigo=?
2018 -Onix
2010 -Onix
2010 -Onix
Hibernate:
select
modelocarr0_.codigo as codigo1_4_0_,
modelocarr0_.categoria as categori2_4_0_,
modelocarr0_.codigo_fabricante as codigo_f4_4_0_,
modelocarr0_.nome as nome3_4_0_
from
modelo_carro modelocarr0_
where
modelocarr0_.codigo=?
2010 - Fiat Uno
2009 - Fiat Uno
Hibernate:
select
modelocarr0_.codigo as codigo1_4_0_,
modelocarr0_.categoria as categori2_4_0_,
modelocarr0_.codigo_fabricante as codigo_f4_4_0_,
modelocarr0_.nome as nome3_4_0_
from
modelo_carro modelocarr0_
where
modelocarr0_.codigo=?
2010 - Bravo
2008 - Bravo
Meu Modelo
@Entity
@Data
public class Carro implements Serializable {
public Carro() {
}
public Carro(String placa, String cor) {
this.placa = placa;
this.cor = cor;
}
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long codigo;
@NotBlank
@NotNull
@Pattern(regexp="([a-zA-Z]{3}-\\d{4})?")
@Size(max=8)
@Column(unique = true,nullable = false , length=8)
private String placa;
@NotBlank
@NotNull
@Size(max=15)
@Column(nullable = false , length=15)
private String cor;
@NotBlank
@NotNull
@Pattern(regexp="\\d{4}")
@Column(length=4)
private String ano;
@ManyToOne(fetch =FetchType.LAZY,cascade = CascadeType.ALL)
@JoinColumn(name="codigo_modeloCarro")
private ModeloCarro modeloCarro;
@Entity
@Table(name = “modelo_carro”)
@Data
public class ModeloCarro implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long codigo;
@NotNull
@NotBlank
@Size(max = 30, min = 2)
@Column(nullable = false, length = 30)
private String nome;
@Enumerated(EnumType.STRING)
private Categoria categoria;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "codigo_fabricante")
private Fabricante fabricante;
public boolean isCarroNovo() {
return this.getCodigo() == null;
}
public boolean isExistente() {
return !isCarroNovo();
}
}