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