Criação de Query via Criteria

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…