Pessoal estou com essa query abaixo e não estou conseguindo cria-la usando o Criteria do Hibernate.
Alguem poderia me ajudar??
SELECT
td.NOME,
so.nome,
CALC.VALOR SALDO
FROM
debito d
JOIN tdc on tdc.id = d.ID_TIPO_DEBITO_CLIENTE
JOIN td on td.id = tdc.ID_TIPO_DEBITO
JOIN cliente on cliente.id = tdc.id_cliente
JOIN CALC ON CALC.ID_DEBITO = d.ID AND CALC.ID_TIPO_CALCULO = 5
JOIN so on cliente.id_suborgao = so.id
JOIN dp on dp.id_debito = d.id
WHERE
d.id = 26126809
[]'s
Para fazer as projeçoes (select campo1, campo2, campo3) use
ProjectionList.add(Projections.property(campo1)).add(Projections.add(campo2)
para fazer os joins vc pode fazer de dois jeitos:
criteria.createCriteria(“tabela2”, “alias”); => faz um join e retorna um novo criteria que representa a tabela2
criteria.createAlias(“tabela2”, “alias”); => faz o join e retorna o mesmo criteria…
além disso vc pode passar um terceiro argumento pra dizer o tipo de join
Teria um exemplo do que você disse???
Ou teria como montar o exemplo baseado na query que lhe passei?
[]'s
supondo que vc tem um Carro que tem muitas Peça’s
Criteria c = session.createCriteria(Carro.class, "c");
c.createAlias("c.pecas", "p") //join
.setProjection(Projections.projectionList()
.add(Projections.property("c.cor")
.add(Projections.property("p.tamanho"));
return c.list();
vai fazer algo como:
select c.cor, p.tamanho from Carro c join Peca p on c.peca_id = p.id
Para relacionamento entre apenas 2 tabelas está bele…
Minha dúvida é quando a tabela A se relaciona com a B e a B se relaciona com a C e a C se relaciona com a D, como eu faço isso???
session.createCriteria(A.class, "a")
.createCriteria("a.b", "b")
.createCriteria("b.c", "c")
.createCriteria("c.d", "d")
vc pode trocar os últimos createCriteria por createAlias que funciona tb…
[]
Essa parte eu entendi perfeitamente.
Estou com um erro que é o seguinte:
Tenho a seguinte situação:
Debito
@OneToMany(mappedBy = "idDebito")
private Set<Calculo> calculoCollection;
Calculo
@ManyToOne
@JoinColumn(name = "ID_DEBITO")
private Debito idDebito;
Impl
Criteria criteria = factory.getSession().createCriteria(Debito.class, "d");
criteria.createCriteria("d.calculoCollection", "calc");
Quando ele gera o SQL para mim, está gerando da seguinte forma:
FROM
Debito this_
INNER JOIN Calculo calc2_ ON this_.id=calc2_.ID_DEBITO
LEFT OUTER JOIN Debito debito5_ ON calc2_.ID_DEBITO=debito5_.id
Ou seja, ele está repetindo o JOIN que estou fazendo sendo que quero que ele faça apenas um INNER JOIN. Esse LEFT JOIN que ele está fazendo está a mais…
Desde já agradeço…
tentou usar o createAlias ao invés do createCriteria?
acho que ele gera outro SQL…
a api de criteria gera uns joins desnecessários de vez em quando mesmo…
vc tem que ver se não está acessando algum atributo que leva a esse segundo join…
ou vc pode marcar o relacionamento como lazy…