problema com consulta hql

01/02/2013

1

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???
Responder

Posts

01/02/2013

Danilo Gomes

Já tentou essa opção

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

?
Responder

01/02/2013

Wisley Souza

Mas vc entendeu que Requisicao nao referencia cotacao e sim que Cotacao que tem o atributo requisicao?
Responder

01/02/2013

Wisley Souza

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


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


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.
Responder

02/02/2013

Danilo Gomes

Está aí, boa pergunta rs

Você quer trazer requisições, tenham elas cotações ou não, mas trazer os dados de cotação também, caso tenham, correto?

É apenas uma sugestão, pois não sei o que acontece nesse caso, mas faria sentido em SQL:

hql.append("from Cotacao c");
hql.append("right outer join fetch c.requisicao re");

Daria prioridade à requisição, mesmo partindo de cotação.

Não sei o que o Hibernate faria com os dados de cotacao nulos.
Responder

02/02/2013

Danilo Gomes

Minha outra opção seria tentar um union, de requisições que pertençam a cotações e requisições que não pertençam.
Responder

04/02/2013

Davi Costa

Pq vc não deixa seu mapeamento biderional?
Resolveria seu problema rapidim.
@OneToMany existe para ser usado mesmo.

abcs
Responder

04/02/2013

Wisley Souza

vc diz fazer uma referencia de Cotação em Requisicao?
Responder

04/02/2013

Danilo Gomes

Isso simplificaria bastante, mas tem que analisar se existe a possibilidade de fazer esta alteração em seu ambiente
Responder

04/02/2013

Davi Costa

Mas não altera em nada,não vai ser criada um coluna novo no banco...
Simplesmente vai só facilitar o desenvolvimento.
Costumo seguir a seguinte regra, não deixar os relacionamentos bidirecionais, até que seja necessário, surgiu necessidade implemento logo.

Mas vc pode questionar será que o JPA não vai deixar a consulta mais pesada? É só usar LAZY.

att Davi
Responder

04/02/2013

Wisley Souza

Foi isso que eu fiz... eu geralmente faço isso com listas que são dependentes de outras classes, mas já que foi o jeito, tinha que ser possível implementar a mesma forma que o sql nativo, pena que quem criou o hql não pensou nisso.
Responder

04/02/2013

Danilo Gomes

Tentou fazer o right join?

Fiquei curioso pra saber o que ocorreria nesse caso.
Responder

04/02/2013

Danilo Gomes

Right join a partir de cotação
Responder

04/02/2013

Wisley Souza

vou fazer e te dar a resposta!!!
Responder

04/02/2013

Wisley Souza

usando right não renderiza a pagina, no debug ele mostra o o tamanho correto ate, se tiver dois ele mostra o tamnho dois, mas estar tudo nulo dentro da lista...
Responder

04/02/2013

Danilo Gomes

Estava supondo o retorno de um SQL comum, todos os campos de cotação viriam nulos, mas os de requisição viriam, existindo ou não o relacionamento.

Imaginei que ele pudesse retornar uma lista com cotações nulas e uma referência para a requisição.

E as requisições que possuem cotação (ou vice versa) viriam completamente preenchidas.
Responder
×
+1 DevUP
Acesso diário, +1 DevUP
Parabéns, você está investindo na sua carreira