problema com consulta hql
01/02/2013
0
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
Posts
01/02/2013
Danilo Gomes
hql.append("from Requisicao re");
hql.append("left outer join fetch re.cotacao c");
?
01/02/2013
Wisley Souza
01/02/2013
Wisley Souza
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.
02/02/2013
Danilo Gomes
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.
02/02/2013
Danilo Gomes
04/02/2013
Davi Costa
Resolveria seu problema rapidim.
@OneToMany existe para ser usado mesmo.
abcs
04/02/2013
Danilo Gomes
04/02/2013
Davi Costa
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
04/02/2013
Wisley Souza
04/02/2013
Danilo Gomes
Fiquei curioso pra saber o que ocorreria nesse caso.
04/02/2013
Wisley Souza
04/02/2013
Danilo Gomes
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.
Clique aqui para fazer login e interagir na Comunidade :)