problema 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:
mas não tem, em SQL normal eu faço assim e funciona:
como eu faço isso no hql???
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???
Wisley Souza
Curtidas 0
Respostas
Danilo Gomes
01/02/2013
Já tentou essa opção
hql.append("from Requisicao re");
hql.append("left outer join fetch re.cotacao c");
?
hql.append("from Requisicao re");
hql.append("left outer join fetch re.cotacao c");
?
GOSTEI 0
Wisley Souza
01/02/2013
Mas vc entendeu que Requisicao nao referencia cotacao e sim que Cotacao que tem o atributo requisicao?
GOSTEI 0
Wisley Souza
01/02/2013
minha classe Requisicao:
minha classe Cotacao:
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:
o que quero saber e como transformar esse sql normal em hql.
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.
GOSTEI 0
Danilo Gomes
01/02/2013
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.
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.
GOSTEI 0
Danilo Gomes
01/02/2013
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.
GOSTEI 0
Davi Costa
01/02/2013
Pq vc não deixa seu mapeamento biderional?
Resolveria seu problema rapidim.
@OneToMany existe para ser usado mesmo.
abcs
Resolveria seu problema rapidim.
@OneToMany existe para ser usado mesmo.
abcs
GOSTEI 0
Wisley Souza
01/02/2013
vc diz fazer uma referencia de Cotação em Requisicao?
GOSTEI 0
Danilo Gomes
01/02/2013
Isso simplificaria bastante, mas tem que analisar se existe a possibilidade de fazer esta alteração em seu ambiente
GOSTEI 0
Davi Costa
01/02/2013
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
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
GOSTEI 0
Wisley Souza
01/02/2013
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.
GOSTEI 0
Danilo Gomes
01/02/2013
Tentou fazer o right join?
Fiquei curioso pra saber o que ocorreria nesse caso.
Fiquei curioso pra saber o que ocorreria nesse caso.
GOSTEI 0
Danilo Gomes
01/02/2013
Right join a partir de cotação
GOSTEI 0
Wisley Souza
01/02/2013
vou fazer e te dar a resposta!!!
GOSTEI 0
Wisley Souza
01/02/2013
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...
GOSTEI 0
Danilo Gomes
01/02/2013
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.
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.
GOSTEI 0
Wisley Souza
01/02/2013
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...
GOSTEI 0
Danilo Gomes
01/02/2013
Apesar da cotação ter vindo nula, conferiu a propriedade requisição?
Se não vier, ou faz o mapeamento bidirecional ou terá as opções já citadas (mais trabalhosas).
Se não vier, ou faz o mapeamento bidirecional ou terá as opções já citadas (mais trabalhosas).
GOSTEI 0
Davi Costa
01/02/2013
Não precisa ter receio de usar o bidrecionamento, como já expliquei não vai alterar nada no banco e nem vai perder performace se seguir minhas dicas.
att Davi
att Davi
GOSTEI 0
Danilo Gomes
01/02/2013
Também acho melhor mapear com relacionamento bidirecional.
Fiquei curioso mesmo de saber o resultado apenas como teste, mas depois tiro minhas conclusões pessoais rs
Fiquei curioso mesmo de saber o resultado apenas como teste, mas depois tiro minhas conclusões pessoais rs
GOSTEI 0