[Resolvido] "Convertendo" SQL em HQL

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)

Tem coisa diferente sim.

Leia esse post: JPA Consultas e Dicas.

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

Tem 3 Classes nessa consulta:

Usuario, Requisicao e ItemRequisicao…

[quote=Hebert Coelho]Tem coisa diferente sim.

Leia esse post: JPA Consultas e Dicas.[/quote]

Vou dar uma olhada :slight_smile:

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

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

[quote=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 [/quote]

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.

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

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:

[code]
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
[/code]

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

[quote=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 [/quote]

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

Qual é o erro que está dando?

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

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

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

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

Olha o meu banco aqui:

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

É 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

[quote=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:

[code]

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

[/code][/quote]

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:

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!

[quote=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: [/quote]Lá no post que eu coloquei tá escrito como funciona e como utilizar o mapeamento e as consultas. [=