Dúvida para fazer uma associação (hibernate)

Bom dia pessoal, tenho 3 tabelas, ‘XXX’, ‘A’ e ‘B’.
A tabela XXX possui um relacionamento com ‘A’ e com ‘B’, e ‘B’ possui um relacionamento com ‘A’ ex:

Tabela: XXX
cd_xxx
cd_b
cd_a
Tabela: B
cd_b
cd_a
Tabela: A
cd_a
pp

Queria retornar todos XXX que tivessem alguma relacionamento com A onde a propriedade de A (pp) fosse igual a alguma coisa, mas esse relacionamento pode ser direto através do relacionamento XXX com A OU através do relacionamento com B e depois A, mas isso tudo num mesmo Criteria. Tem como fazer isso?

Tentei algo simples assim:

Criteria criteria = session.createCriteria(XXX.class);
criteria.createCriteria("A").add(Restrictions.eq("pp", 1));
criteria.createCriteria("B").createCriteria("A").add(Restrictions.eq("pp", 1000));

Que me gera um sql mais ou menos assim

select * from XXX 
left outer join a a1 on a1.cd_a=XXX.cd_a 
left outer join b b1 on b1.cd_b=XXX.cd_b 
left outer join a a2 on a2.cd_a=b1.cd_a 
where (a1.pp = 1000 and a2.pp = 1000)

Então tem um problema que se XXX tem relacionamento direto com A e não tiver relacionamento com B (cd_b de XXX = null) ele não me retorna, e eu queria que retornasse, um sql assim ja me ajudaria:

select * from XXX 
left outer join a a1 on a1.cd_a=XXX.cd_a 
left outer join b b1 on b1.cd_b=XXX.cd_b 
left outer join a a2 on a2.cd_a=b1.cd_a 
where (a1.pp = 1000 or a2.pp = 1000)

alguem sabe se tem como fazer isso e pode me dar um help?!

valeu!

cd_b eh PK em XXX???

se for nao tem muito o q fazer nao…

revisa seu modelo do banco, se isso for possivel…e aih revise o mapeamento do hibernate…

cd_b eh chave estrangeira em XXX e chave primeira em B
cd_xxx eh chave primeira em XXX
cd_a eh chave estrangeira em XXX e B e chave primaria em A

o q vc quer seria algo assim:

SELECT * FROM XXX WHERE CD_A = (SELECT CD_A FROM A WHERE PP='ALGUMA COISA')

mas isso nao vai funcionar…pq o select na tabela A, pode retornar mais q um registro…

a aolução nao eh mais performatica admito…mas eh o q me vem a cabeça agora, faz o seguinte:

aih vc obtem 1 ou mais cd_a…

depois em loop vc faz:

dependendo do caso esse tipo de solução eh boa, pq vc tem mais controle na aplicação sobre o q esta acontecendo…mas claro q por essa responsabilidade no banco com certeza fica mais rapido…vamos ver se alguem faz uma query legal pra vc aih…hahahaha

flw…

na real o que eu queria mesmo era colocar essa consulta em um unico criteria, pq já tenho uma serie de funcionalidades implementadas que funcionam atrvés do criteria. Mas deixa, fiz duas consultas mesmo.