How to optimize Hibernate query

Asked

Viewed 562 times

3

I am developing a system in JAVA and use Hibernante 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 some class fields (not all) but Hibernante makes a Hql that takes all fields and it ends up taking much longer than it should. It has how to make some kind of filter to pick up only the fields I need?

Here’s a generic example of what’s going on.

@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=?

Simply put, I want to query in a way that only returns the attributes I used in the Main class, and in HQL I don’t have all these attributes described. You have some way of doing this?

1 answer

2

Yes, there is.

There are several ways. The most popular is to create a specific class to receive only the attributes you want. This class is instantiated within the HQL itself and you pass to the class constructor the attributes you want to pass.

We imagine that for this you have created a class br.com.projeto.dto.EntidadeDto to receive only the id, campo1 and campo2:

class EntidadeDto {

    private int id;
    private String campo1;
    private String campo2;

    EntidadeDto (int id, String campo1, String campo2) {
        this.id = id;
        this.campo1 = campo1;
        this.campo2 = campo2;
    }
    //getters
}

Your hql could be:

SELECT new br.com.projeto.dto.EntidadeDto(e.id, e.campo1, e.campo2) 
FROM Entidade1 e WHERE e.id = 1

So you would receive from getResultList() one List<EntidadeDto>.

  • I gave an upvote, but consider at least citing which are these various ways to get a reference in the response itself.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.