Problema em um join com consulta hql

Olá galera, tenho o objeto requisicao, em que tenho que fazer a consulta a partir dele, e tenho tbm o cotacao, que faz referencia a requisicao,

sse o objeto requisicao tivesse a a referencia eu faria assim:

hql.append("from Requisicao re");
hql.append("inner join fetch re.cotacao c");

mas não tem, em SQL normal eu faço assim e funciona:

SELECT * FROM REQUISICAO AS re
LEFT JOIN COTACAO AS c ON c.ID_REQUISICAO = re.id

como eu faço isso no hql???

Explica direito que não entendi lhufas.

minha classe Requisicao:

Entity
@Table(name = "REQUISICAO")
public class Requisicao implements Identificavel<Long> {

	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id;

	@Column(name = "NUM_SEQ")
	private Integer numSequencia;

	@Column(name = "ANO_SEQ")
	private Integer anoSequencia;

	@Label("lblRequisitante")
	@JoinColumn(name = "ID_REQUISICAO", nullable = true)
	@ManyToOne(fetch = FetchType.LAZY)
	private Usuario requisitante;

      //gets e sets

}

minha classe Cotacao:


@Entity
@Table(name = "COTACAO")
public class Cotacao implements Identificavel<Long> {

	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "ID")
	private Long id;

	@Temporal(TemporalType.DATE)
	@Column(name = "DT_REQUISICAO")
	@Label("lblDataRequisicao")
	private Date dataFechamento;
	
	@Label("lblRequisicao")
	@JoinColumn(name = "ID_REQUISICAO", nullable = true)
	@ManyToOne(fetch = FetchType.LAZY)
	private Requisicao requisicao;

      //gets e sets

}

A minha consulta HQl parte de requisicao,
eu verifico se ela esta cotada ou nao

Eu faria assim, se Requisicao tivesse o atributo cotacao, mas e cotacao que contem requisicao

em sql normal, funciona:


SELECT * FROM REQUISICAO AS re  
LEFT JOIN COTACAO AS c ON c.ID_REQUISICAO = re.id  

o que quero saber e como transformar esse sql normal em hql.

minha classe Requisicao:

Entity
@Table(name = "REQUISICAO")
public class Requisicao implements Identificavel<Long> {

	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id;

	@Column(name = "NUM_SEQ")
	private Integer numSequencia;

	@Column(name = "ANO_SEQ")
	private Integer anoSequencia;

	@Label("lblRequisitante")
	@JoinColumn(name = "ID_REQUISICAO", nullable = true)
	@ManyToOne(fetch = FetchType.LAZY)
	private Usuario requisitante;

      //gets e sets

}

minha classe Cotacao:


@Entity
@Table(name = "COTACAO")
public class Cotacao implements Identificavel<Long> {

	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "ID")
	private Long id;

	@Temporal(TemporalType.DATE)
	@Column(name = "DT_REQUISICAO")
	@Label("lblDataRequisicao")
	private Date dataFechamento;
	
	@Label("lblRequisicao")
	@JoinColumn(name = "ID_REQUISICAO", nullable = true)
	@ManyToOne(fetch = FetchType.LAZY)
	private Requisicao requisicao;

      //gets e sets

}

A minha consulta HQl parte de requisicao,
eu verifico se ela esta cotada ou nao

Eu faria assim, se Requisicao tivesse o atributo cotacao, mas e cotacao que contem requisicao

em sql normal, funciona:


SELECT * FROM REQUISICAO AS re  
LEFT JOIN COTACAO AS c ON c.ID_REQUISICAO = re.id  

o que quero saber e como transformar esse sql normal em hql.

Entendeu agora brother

[quote=winigma]Olá galera, tenho o objeto requisicao, em que tenho que fazer a consulta a partir dele, e tenho tbm o cotacao, que faz referencia a requisicao,

sse o objeto requisicao tivesse a a referencia eu faria assim:

hql.append("from Requisicao re");
hql.append("inner join fetch re.cotacao c");

mas não tem, em SQL normal eu faço assim e funciona:

SELECT * FROM REQUISICAO AS re
LEFT JOIN COTACAO AS c ON c.ID_REQUISICAO = re.id

como eu faço isso no hql???[/quote]

No java voce ta colocando INNER, e no seu SQL na mao voce ta colocando LEFT, sao 2 coisas diferentes.

So responde 1 pergunta, o que voce quer trazer nesse sql ? voce quer trazer cotacao a partir de Requisicao ?

ta amigo, foi erro ali, era só pra demonstrar mas tanto faz se e left ou só join…

entendeu

Isso mesmo, quero buscar as cotações que contenha requisicao… no sql normal funciona, o que tem vem o que não tem aparece null…

Mas em hql, que deveria ser mais fácil a mesma técnica não funciona.

[quote=winigma]ta amigo, foi erro ali, era só pra demonstrar mas tanto faz se e left ou só join…

entendeu[/quote]

Entendi nao, mas esquece, e responda minha pergunta, voce quer trazer cotacao a partir de Requisicao ?

vc viu minha consulta em SQL??? quero que aquilo seja feito em hql, compreende? aquilo simplesmente funciona!!!

Tenta assim:

hql.append("SELECT re.cotacao FROM Requisicao re");

Isso não vai funcionar, pq minha entidade requisicao, não contém o atributo cotação, ele não faz referencia…

a entidade cotação que referencia requisicao, vc viu as entidades que postei?

Vi nao, pera la, hehehehe.

Cotação


@Entity  
@Table(name = "COTACAO")  
public class Cotacao implements Identificavel<Long> {  
  
    private static final long serialVersionUID = 1L;  
  
    @Id  
    @GeneratedValue(strategy = GenerationType.IDENTITY)  
    @Column(name = "ID")  
    private Long id;  
  
    @Temporal(TemporalType.DATE)  
    @Column(name = "DT_REQUISICAO")  
    @Label("lblDataRequisicao")  
    private Date dataFechamento;  
      
    @Label("lblRequisicao")  
    @JoinColumn(name = "ID_REQUISICAO", nullable = true)  
    @ManyToOne(fetch = FetchType.LAZY)  
    private Requisicao requisicao;  
  
      //gets e sets  
  
}  

requisicao

[code]
Entity
@Table(name = “REQUISICAO”)
public class Requisicao implements Identificavel {

private static final long serialVersionUID = 1L;  

@Id  
@GeneratedValue(strategy = GenerationType.IDENTITY)  
private Long id;  

@Column(name = "NUM_SEQ")  
private Integer numSequencia;  

@Column(name = "ANO_SEQ")  
private Integer anoSequencia;  

@Label("lblRequisitante")  
@JoinColumn(name = "ID_REQUISICAO", nullable = true)  
@ManyToOne(fetch = FetchType.LAZY)  
private Usuario requisitante;  

  //gets e sets  

} [/code]

Na sua classe cotacao tem um referencia para Requisicao, porque nao faz ao contrario ?

hql.append("FROM Cotacao c where c.requisicao.id = :idRequisicao");
query.setParameter("idRequisicao", idRequisicao);

Ou, trazer todas as cotacoes que TENHAM requisicao, que é o que voce quer.

hql.append("FROM Cotacao c where c.requisicao.id is not null"); 

Voce pode usar outra coluna de requisicao, a que voce achar mais importante para filtrar os dados.

Serve ? Testou ae ?

Bom pq eu sempre terei requisicao, e as vezes cotacao,…

HQL nao tem todos os recursos de do SQL, se dar pra fazer em sql não é pra ser possível ser feito em hql?

nothing???