I'm developing a JAVA system and I use Hibernate to generate my queries with the bank. I need to solve the following problem:
I have some classes that belong to an entity and I need to execute a method that returns me some fields of the class (not all) but Hibernate does a Hql that takes all the fields and this ends up taking a lot more than it should. Can you make some kind of filter to just get the fields I need?
Here's a generic example of what's happening.
@Entity
@Table(name = "entidade1")
public class Entidade1 extends GenericEntidade implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
private Integer id;
private Integer campo1;
private Integer campo2;
private Integer campo3;
private Integer campo4;
private Integer campo5;
/**
* @return the id
*/
public Integer getId() {
return id;
}
/**
* @param id the id to set
*/
public void setId(Integer id) {
this.id = id;
}
/**
* @return the campo1
*/
public Integer getCampo1() {
return campo1;
}
/**
* @param campo1 the campo1 to set
*/
public void setCampo1(Integer campo1) {
this.campo1 = campo1;
}
/**
* @return the campo2
*/
public Integer getCampo2() {
return campo2;
}
/**
* @param campo2 the campo2 to set
*/
public void setCampo2(Integer campo2) {
this.campo2 = campo2;
}
/**
* @return the campo3
*/
public Integer getCampo3() {
return campo3;
}
/**
* @param campo3 the campo3 to set
*/
public void setCampo3(Integer campo3) {
this.campo3 = campo3;
}
/**
* @return the campo4
*/
public Integer getCampo4() {
return campo4;
}
/**
* @param campo4 the campo4 to set
*/
public void setCampo4(Integer campo4) {
this.campo4 = campo4;
}
/**
* @return the campo5
*/
public Integer getCampo5() {
return campo5;
}
/**
* @param campo5 the campo5 to set
*/
public void setCampo5(Integer campo5) {
this.campo5 = campo5;
}
}
@Entity
@Table(name = "entidade2")
public class Entidade2 extends GenericEntidade implements Serializable {
private static final long serialVersionUID = 1L;
/**
* @return the serialVersionUID
*/
public static long getSerialVersionUID() {
return serialVersionUID;
}
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
private Integer id;
private Integer campo1;
private Integer campo2;
private Integer campo3;
private Integer campo4;
private Integer campo5;
/**
* @return the id
*/
public Integer getId() {
return id;
}
/**
* @param id the id to set
*/
public void setId(Integer id) {
this.id = id;
}
/**
* @return the campo1
*/
public Integer getCampo1() {
return campo1;
}
/**
* @param campo1 the campo1 to set
*/
public void setCampo1(Integer campo1) {
this.campo1 = campo1;
}
/**
* @return the campo2
*/
public Integer getCampo2() {
return campo2;
}
/**
* @param campo2 the campo2 to set
*/
public void setCampo2(Integer campo2) {
this.campo2 = campo2;
}
/**
* @return the campo3
*/
public Integer getCampo3() {
return campo3;
}
/**
* @param campo3 the campo3 to set
*/
public void setCampo3(Integer campo3) {
this.campo3 = campo3;
}
/**
* @return the campo4
*/
public Integer getCampo4() {
return campo4;
}
/**
* @param campo4 the campo4 to set
*/
public void setCampo4(Integer campo4) {
this.campo4 = campo4;
}
/**
* @return the campo5
*/
public Integer getCampo5() {
return campo5;
}
/**
* @param campo5 the campo5 to set
*/
public void setCampo5(Integer campo5) {
this.campo5 = campo5;
}
}
@Entity
@Table(name = "entidade3")
public class Entidade3 extends GenericEntidade implements Serializable {
private static final long serialVersionUID = 1L;
/**
* @return the serialVersionUID
*/
public static long getSerialVersionUID() {
return serialVersionUID;
}
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
private Integer id;
private Integer campo1;
private Integer campo2;
private Integer campo3;
private Integer campo4;
private Integer campo5;
/**
* @return the id
*/
public Integer getId() {
return id;
}
/**
* @param id the id to set
*/
public void setId(Integer id) {
this.id = id;
}
/**
* @return the campo1
*/
public Integer getCampo1() {
return campo1;
}
/**
* @param campo1 the campo1 to set
*/
public void setCampo1(Integer campo1) {
this.campo1 = campo1;
}
/**
* @return the campo2
*/
public Integer getCampo2() {
return campo2;
}
/**
* @param campo2 the campo2 to set
*/
public void setCampo2(Integer campo2) {
this.campo2 = campo2;
}
/**
* @return the campo3
*/
public Integer getCampo3() {
return campo3;
}
/**
* @param campo3 the campo3 to set
*/
public void setCampo3(Integer campo3) {
this.campo3 = campo3;
}
/**
* @return the campo4
*/
public Integer getCampo4() {
return campo4;
}
/**
* @param campo4 the campo4 to set
*/
public void setCampo4(Integer campo4) {
this.campo4 = campo4;
}
/**
* @return the campo5
*/
public Integer getCampo5() {
return campo5;
}
/**
* @param campo5 the campo5 to set
*/
public void setCampo5(Integer campo5) {
this.campo5 = campo5;
}
}
@Entity
@Table(name = "entidade4")
public class Entidade4 extends GenericEntidade implements Serializable {
private static final long serialVersionUID = 1L;
/**
* @return the serialVersionUID
*/
public static long getSerialVersionUID() {
return serialVersionUID;
}
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
private Integer id;
@ManyToOne
private Entidade5 campo1;
private Integer campo2;
private Integer campo3;
private Integer campo4;
private Integer campo5;
/**
* @return the id
*/
public Integer getId() {
return id;
}
/**
* @param id the id to set
*/
public void setId(Integer id) {
this.id = id;
}
/**
* @return the campo1
*/
public Entidade5 getCampo1() {
return campo1;
}
/**
* @param campo1 the campo1 to set
*/
public void setCampo1(Entidade5 campo1) {
this.campo1 = campo1;
}
/**
* @return the campo2
*/
public Integer getCampo2() {
return campo2;
}
/**
* @param campo2 the campo2 to set
*/
public void setCampo2(Integer campo2) {
this.campo2 = campo2;
}
/**
* @return the campo3
*/
public Integer getCampo3() {
return campo3;
}
/**
* @param campo3 the campo3 to set
*/
public void setCampo3(Integer campo3) {
this.campo3 = campo3;
}
/**
* @return the campo4
*/
public Integer getCampo4() {
return campo4;
}
/**
* @param campo4 the campo4 to set
*/
public void setCampo4(Integer campo4) {
this.campo4 = campo4;
}
/**
* @return the campo5
*/
public Integer getCampo5() {
return campo5;
}
/**
* @param campo5 the campo5 to set
*/
public void setCampo5(Integer campo5) {
this.campo5 = campo5;
}
}
@Entity
@Table(name = "entidade5")
public class Entidade5 extends GenericEntidade implements Serializable {
private static final long serialVersionUID = 1L;
/**
* @return the serialVersionUID
*/
public static long getSerialVersionUID() {
return serialVersionUID;
}
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
private Integer id;
private Integer campo1;
private Integer campo2;
private Integer campo3;
private Integer campo4;
private Integer campo5;
/**
* @return the id
*/
public Integer getId() {
return id;
}
/**
* @param id the id to set
*/
public void setId(Integer id) {
this.id = id;
}
/**
* @return the campo1
*/
public Integer getCampo1() {
return campo1;
}
/**
* @param campo1 the campo1 to set
*/
public void setCampo1(Integer campo1) {
this.campo1 = campo1;
}
/**
* @return the campo2
*/
public Integer getCampo2() {
return campo2;
}
/**
* @param campo2 the campo2 to set
*/
public void setCampo2(Integer campo2) {
this.campo2 = campo2;
}
/**
* @return the campo3
*/
public Integer getCampo3() {
return campo3;
}
/**
* @param campo3 the campo3 to set
*/
public void setCampo3(Integer campo3) {
this.campo3 = campo3;
}
/**
* @return the campo4
*/
public Integer getCampo4() {
return campo4;
}
/**
* @param campo4 the campo4 to set
*/
public void setCampo4(Integer campo4) {
this.campo4 = campo4;
}
/**
* @return the campo5
*/
public Integer getCampo5() {
return campo5;
}
/**
* @param campo5 the campo5 to set
*/
public void setCampo5(Integer campo5) {
this.campo5 = campo5;
}
}
@Entity
@NamedQueries({
@NamedQuery(name = "EntidadePrincipal.getAll", query
= "SELECT c from EntidadePrincipal c")
})
public class EntidadePrincipal implements Serializable {
@Id
@Basic(optional = false)
@Column(name = "id")
private Integer id;
@ManyToOne
private Entidade1 obra;
@ManyToOne
private Entidade2 fornecedor;
@OneToMany(cascade = CascadeType.ALL)
private List<Entidade3> notas;
@OneToMany(cascade = CascadeType.ALL)
private List<Entidade4> itens;
public List doAll() {
return new GenericDaoImpl().getEntityManager().createNamedQuery("EntidadePrincipal.getAll").getResultList();
}
/**
* @return the id
*/
public Integer getId() {
return id;
}
/**
* @param id the id to set
*/
public void setId(Integer id) {
this.id = id;
}
/**
* @return the obra
*/
public Entidade1 getObra() {
return obra;
}
/**
* @param obra the obra to set
*/
public void setObra(Entidade1 obra) {
this.obra = obra;
}
/**
* @return the fornecedor
*/
public Entidade2 getFornecedor() {
return fornecedor;
}
/**
* @param fornecedor the fornecedor to set
*/
public void setFornecedor(Entidade2 fornecedor) {
this.fornecedor = fornecedor;
}
/**
* @return the notas
*/
public List<Entidade3> getNotas() {
return notas;
}
/**
* @param notas the notas to set
*/
public void setNotas(List<Entidade3> notas) {
this.notas = notas;
}
/**
* @return the itens
*/
public List<Entidade4> getItens() {
return itens;
}
/**
* @param itens the itens to set
*/
public void setItens(List<Entidade4> itens) {
this.itens = itens;
}
}
public class Main {
public static void main(String[] args) {
List<kuab.oc.model.entity.EntidadePrincipal> lista = new kuab.oc.model.entity.EntidadePrincipal().doAll();
System.out.print(lista.get(0).getFornecedor());
System.out.print(lista.get(0).getItens().get(0).getCampo1().getId());
System.out.print(lista.get(0).getNotas().get(0).getCampo1());
System.out.print(lista.get(0).getObra().getId());
}
}
Here is the sql that Hibernate generates and as you can see it returns all fields.
Hibernate:
select
entidadepr0_.id as id1_6_,
entidadepr0_.fornecedor_id as forneced2_6_,
entidadepr0_.obra_id as obra_id3_6_
from
EntidadePrincipal entidadepr0_
Hibernate:
select
entidade2x0_.id as id1_59_0_,
entidade2x0_.campo1 as campo2_59_0_,
entidade2x0_.campo2 as campo3_59_0_,
entidade2x0_.campo3 as campo4_59_0_,
entidade2x0_.campo4 as campo5_59_0_,
entidade2x0_.campo5 as campo6_59_0_
from
entidade2 entidade2x0_
where
entidade2x0_.id=?
Hibernate:
select
entidade1x0_.id as id1_58_0_,
entidade1x0_.campo1 as campo2_58_0_,
entidade1x0_.campo2 as campo3_58_0_,
entidade1x0_.campo3 as campo4_58_0_,
entidade1x0_.campo4 as campo5_58_0_,
entidade1x0_.campo5 as campo6_58_0_
from
entidade1 entidade1x0_
where
entidade1x0_.id=?
kuab.oc.model.entity.teste.Entidade2@1a91c9bHibernate:
select
itens0_.EntidadePrincipal_id as Entidade1_6_0_,
itens0_.itens_id as itens_id2_8_0_,
entidade4x1_.id as id1_61_1_,
entidade4x1_.campo1_id as campo6_61_1_,
entidade4x1_.campo2 as campo2_61_1_,
entidade4x1_.campo3 as campo3_61_1_,
entidade4x1_.campo4 as campo4_61_1_,
entidade4x1_.campo5 as campo5_61_1_,
entidade5x2_.id as id1_62_2_,
entidade5x2_.campo1 as campo2_62_2_,
entidade5x2_.campo2 as campo3_62_2_,
entidade5x2_.campo3 as campo4_62_2_,
entidade5x2_.campo4 as campo5_62_2_,
entidade5x2_.campo5 as campo6_62_2_
from
EntidadePrincipal_entidade4 itens0_
inner join
entidade4 entidade4x1_
on itens0_.itens_id=entidade4x1_.id
left outer join
entidade5 entidade5x2_
on entidade4x1_.campo1_id=entidade5x2_.id
where
itens0_.EntidadePrincipal_id=?
1Hibernate:
select
notas0_.EntidadePrincipal_id as Entidade1_6_0_,
notas0_.notas_id as notas_id2_7_0_,
entidade3x1_.id as id1_60_1_,
entidade3x1_.campo1 as campo2_60_1_,
entidade3x1_.campo2 as campo3_60_1_,
entidade3x1_.campo3 as campo4_60_1_,
entidade3x1_.campo4 as campo5_60_1_,
entidade3x1_.campo5 as campo6_60_1_
from
EntidadePrincipal_entidade3 notas0_
inner join
entidade3 entidade3x1_
on notas0_.notas_id=entidade3x1_.id
where
notas0_.EntidadePrincipal_id=?
In short, I want to query in a way that returns only the attributes I used in the Main class, and HQL does not have all these attributes described. Do you have any way to do this?