[Resolvido] "Convertendo" SQL em HQL

21 respostas
tiago_

Pessoal

Tenho uma consulta q roda perfeitamente no mysql.
Testei ela no HQL editor e deu algum erro…

Vou postar a minha consulta aqui:

select u.nome, r.dataHora, ir.quantidadeSolicitada, i.nome from Usuario u
inner join Requisicao r on u.codigo = r.codigoUsuario
inner join ItemRequisicao ir on r.codigo = ir.codigoRequisicao
inner join Item i on i.codigo = ir.codigoItem where u.codigo = 4

Tem algo diferente em relacao a sintaxe do HQL ?

Obrigado 8)

21 Respostas

Hebert_Coelho

Tem coisa diferente sim.

Leia esse post: JPA Consultas e Dicas.

drsmachado

Camarada, o mais ideal seria apresentar as entidades que estão envolvidas nesta questão.

tiago_

Tem 3 Classes nessa consulta:

Usuario, Requisicao e ItemRequisicao…

tiago_

Hebert Coelho:
Tem coisa diferente sim.

Leia esse post: JPA Consultas e Dicas.

Vou dar uma olhada :slight_smile:

tiago_

Pessoal

Tava lendo algumas coisas e nao to entendendo direito.
Alguém poderia me ajudar a converter essa SQL em HQL ?
Ou me explicar e…

Abracos

Arthur_F_Ferreira

Um Usuario pode ter ‘n’ requisições e uma requisição pertence a um usuário certo?
Uma requisição pode ter ‘n’ itens de requisição e um item de requisição pertence a uma requisição, certo?
Um item de requisição pode ter ‘n’ itens e um item pertence a um item de requisição, certo?

Com isso em mente vc tem algo do tipo (código sem as anotações do Hibernate):

public class Usuario {

    private Long codigo;
    
    private String nome;
    
    private Date dataHora;
	
	private List<Requisicao> requisicoes;
    
    // metodos
}
public class Requisicao {

    private Long codigo;
    
    private Usuario usuario;
	
	private List<Requisicao> itensRequisicoes;
    
    // metodos
}
public class ItemRequisicao {

    private Long codigo;
    
    private Requisicao requisicao;
	
	private List<Item> itens;
    
    // metodos
}
public class Item {

    private Long codigo;
    
    private ItemRequisicao itemRequisicao;
    
    // metodos
}

Se for tudo isso que eu disse aqui e seu código estiver com as anotações de relacionamentos feitas corretamente, seu HQL fica:

SELECT
    u.nome, 
    r.dataHora, 
    ir.quantidadeSolicitada, 
    i.nome
FROM
    Usuario as u
    inner join u.requisicoes as r
    inner join r.itensRequisicoes as ir
    inner join ir.itens as i
WHERE
    u.codigo = 4
tiago_

Arthur F. Ferreira:
Um Usuario pode ter ‘n’ requisições e uma requisição pertence a um usuário certo?
Uma requisição pode ter ‘n’ itens de requisição e um item de requisição pertence a uma requisição, certo?
Um item de requisição pode ter ‘n’ itens e um item pertence a um item de requisição, certo?

Com isso em mente vc tem algo do tipo (código sem as anotações do Hibernate):

public class Usuario {

    private Long codigo;
    
    private String nome;
    
    private Date dataHora;
	
	private List<Requisicao> requisicoes;
    
    // metodos
}
public class Requisicao {

    private Long codigo;
    
    private Usuario usuario;
	
	private List<Requisicao> itensRequisicoes;
    
    // metodos
}
public class ItemRequisicao {

    private Long codigo;
    
    private Requisicao requisicao;
	
	private List<Item> itens;
    
    // metodos
}
public class Item {

    private Long codigo;
    
    private ItemRequisicao itemRequisicao;
    
    // metodos
}

Se for tudo isso que eu disse aqui e seu código estiver com as anotações de relacionamentos feitas corretamente, seu HQL fica:

SELECT u.nome, r.dataHora, ir.quantidadeSolicitada, i.nome FROM Usuario as u inner join u.requisicoes as r inner join r.itensRequisicoes as ir inner join ir.itens as i WHERE u.codigo = 4

Muito obrigado pela explicacao :slight_smile:

Vou colocar aqui minhas classes:

Usuario

@Entity
@Table(name="usuario")
public class Usuario implements Serializable{
	
	 
	
	private static final long serialVersionUID = -6755569886340789158L;
	
	@Id
	@GeneratedValue
	@Column(name="codigo")
	private Integer codigo;
	
	@Column(name="nome", length=45, nullable= true)
	private String nome;
	
    @Column(name="matricula", length=45, nullable= true)
	private String matricula;
    
    @org.hibernate.annotations.NaturalId
    @Column(name="login", length=45, nullable= true)  
	private String login;
    
    
    @Column(name="senha", length=45, nullable= true)
	private String senha;
    
    @Column(name="ativo")
	private boolean ativo;
	
	@ManyToOne
	@JoinColumn(name="codigoSetor")
	private Setor setor;

        ...

Requisicao:

@Entity
@Table(name="requisicao")


public class Requisicao implements Serializable{

	private static final long serialVersionUID = -3123513467499966683L;
	
	@Id
	@GeneratedValue
	@Column(name="codigo")
	private Integer codigo;
	
	@Column(name="dataHora",length=80, nullable=true)
	private String dataHora;
	
	@ManyToOne
	@JoinColumn(name="codigoUsuario", nullable=true)
	private Usuario usuario;
	
	@ManyToOne
	@JoinColumn(name="codigoStatus", nullable=false  )
	private Status status;
  
        ...

ItemRequisicao

@Entity
@Table(name="item_x_requisicao")

public class ItemRequisicao implements Serializable{

	private static final long serialVersionUID = 7029429020763441219L;
	
	@Id
	@GeneratedValue
	@Column(name="codigo")
	private Integer codigo;
	
	@Column(name="quantidadeSolicitada", length=10, nullable=true)
	private int quantidadeSolicitada;
	
	@Column(name="quantidadeAtendida", length=10, nullable=false)
	private int quantidadeAtendida;
	
	@ManyToOne
	@JoinColumn(name="codigoItem")
	private Item item;
	
	@ManyToOne
	@JoinColumn(name="codigoRequisicao")
	private Requisicao requisicao;
     
        ...

Vou tentar implementar o seu codigo HQL baseado nas minhas classes…
Qualquer coisa posto aqui :slight_smile:
Meu mapeamento ta desse jeito.

tiago_

Meu mapeamento ta diferente do seu exemplo…

Tentei fazer assim mas deu erro…

select
 u.nome,
 r.dataHora,
 ir.quantidadeSolicitada,
 i.nome

from

 Usuario as u
 inner join u.requisicao as r
 inner join r.itemRequisicao as ir
 inner join ir.item as i

where
 u.codigo=1
Arthur_F_Ferreira
inner join u.requisicao as r

Usuário não possui uma requisição. Ele possui várias requisições, certo? Pelo exemplo que você colocou, o certo era fazer o caminho inverso:

select  
    u.nome,  
    r.dataHora,  
    ir.quantidadeSolicitada,  
    i.nome  
from  
    Item as i
    inner join i.itemRequisicao as ir
    inner join ir.requisicao as r
    inner join r.usuario as u
tiago_

Arthur F. Ferreira:
inner join u.requisicao as r

Usuário não possui uma requisição. Ele possui várias requisições, certo? Pelo exemplo que você colocou, o certo era fazer o caminho inverso:

select u.nome, r.dataHora, ir.quantidadeSolicitada, i.nome from Item as i inner join i.itemRequisicao as ir inner join ir.requisicao as r inner join r.usuario as u

isso mesmo, um usuario possui varias requisicoes…

Entao, fiz do jeito q vc falou (faz sentido) e deu erro:

select    
    u.nome,    
    r.dataHora,    
    ir.quantidadeSolicitada,    
    i.nome    
from    
    Item as i  
    inner join i.itemRequisicao as ir  
    inner join ir.requisicao as r  
    inner join r.usuario as u 

    where u.codigo = 1
Arthur_F_Ferreira

Qual é o erro que está dando?

tiago_

TO usando o HQL editor p testar… O erro foi:

org.hibernate.QueryException: could not resolve property itemRequisicao of: …

tiago_
Arthur_F_Ferreira

Ele diz que a sua classe Item não possui o atributo itemRequisicao.

tiago_

ItemRequisicao eh uma classe… E essa classe tem uma chave estrangeira codigoItem…

Olha o meu banco aqui:

http://s14.postimage.org/fhzymljr5/bancodedados.png

Arthur_F_Ferreira

É um para um o relacionamento? Se for, sua classe ItemRequisicao deveria estar mapeada da seguinte forma:

public class ItemRequisicao {
    @Id
    private Long codigo;

    @OneToOne(fetch = FetchType.LAZY, mappedBy = "itemRequisicao", cascade = CascadeType.ALL)
    private Item item;
}

Aí o HQL fica:

select      
        u.nome,      
        r.dataHora,      
        ir.quantidadeSolicitada,      
        i.nome      
    from      
        ItemRequisicao ir
        inner join ir.item as i
        inner join ir.requisicao as r    
        inner join r.usuario as u   
    where 
        u.codigo = 1
tiago_
Arthur F. Ferreira:
É um para um o relacionamento? Se for, sua classe ItemRequisicao deveria estar mapeada da seguinte forma:
public class ItemRequisicao {
    @Id
    private Long codigo;

    @OneToOne(fetch = FetchType.LAZY, mappedBy = "itemRequisicao", cascade = CascadeType.ALL)
    private Item item;
}

Aí o HQL fica:

select      
        u.nome,      
        r.dataHora,      
        ir.quantidadeSolicitada,      
        i.nome      
    from      
        ItemRequisicao ir
        inner join ir.item as i
        inner join ir.requisicao as r    
        inner join r.usuario as u   
    where 
        u.codigo = 1

Meu querido, muito obrigado por tudo... A HQL ta certinha, entendi melhor a sintaxe do hibernate...

So queria q vc me explicasse o mapeamento q vc sugeriu... Mas de qualquer forma vou pesquisar
sobre o assunto. Muito obrigado :)

Abraco :)

Arthur_F_Ferreira

Infelizmente eu não pude ver a imagem do seu banco. Vendo a imagem eu posso sugerir os mapeamentos corretos. Eu fui mais de “orelhada” e me guiando pelo código que você colocou aqui. Mas foi bom que tenha funcionado e que você tenha compreendido melhor a sintaxe do Hibernate.

Abraços!

Hebert_Coelho

tiago__:
Meu querido, muito obrigado por tudo… A HQL ta certinha, entendi melhor a sintaxe do hibernate…

So queria q vc me explicasse o mapeamento q vc sugeriu… Mas de qualquer forma vou pesquisar
sobre o assunto. Muito obrigado :slight_smile:

Abraco :slight_smile:

Lá no post que eu coloquei tá escrito como funciona e como utilizar o mapeamento e as consultas. [=

tiago_

Hebert Coelho:
tiago__:
Meu querido, muito obrigado por tudo… A HQL ta certinha, entendi melhor a sintaxe do hibernate…

So queria q vc me explicasse o mapeamento q vc sugeriu… Mas de qualquer forma vou pesquisar
sobre o assunto. Muito obrigado :slight_smile:

Abraco :slight_smile:

Lá no post que eu coloquei tá escrito como funciona e como utilizar o mapeamento e as consultas. [=

Ta bom, meu velho… Vou dar uma olhada. Agora to precisando listar essa consulta em um dataTable…
To procurando um exemplo aqui :slight_smile:

Hebert_Coelho

tiago__:
Hebert Coelho:
tiago__:
Meu querido, muito obrigado por tudo… A HQL ta certinha, entendi melhor a sintaxe do hibernate…

So queria q vc me explicasse o mapeamento q vc sugeriu… Mas de qualquer forma vou pesquisar
sobre o assunto. Muito obrigado :slight_smile:

Abraco :slight_smile:

Lá no post que eu coloquei tá escrito como funciona e como utilizar o mapeamento e as consultas. [=

Ta bom, meu velho… Vou dar uma olhada. Agora to precisando listar essa consulta em um dataTable…
To procurando um exemplo aqui :)

Blz. Aqui tem: Aplicação Web Completa Tomcat JSF Primefaces JPA Hibernate

Criado 26 de dezembro de 2012
Ultima resposta 26 de dez. de 2012
Respostas 21
Participantes 4