INNER JOIN repetido em query com Criteria

0 respostas
darlanmoraes

Olá,

Estou trabalhando em um método em que uma determinada tabela necessita fazer join com outra e com um campo desta segunda tabela ainda fazer outra comparação com ela. Algo assim:

SELECT *
FROM tab1 INNER JOIN tab2
WHERE tab2.id = (SELECT MAX(id) FROM tab2)
O método está da seguinte maneira
CriteriaBuilder cb = manager.getCriteriaBuilder();
CriteriaQuery<Subs> c = cb.createQuery(Subs.class);
Root<Subs> subs = c.from(Subs.class);
Subquery<Number> sq = c.subquery(Number.class);
Root<Auth> auth = sq.from(Auth.class);
sq.select(cb.max(auth.get("authId").as(Number.class)));			
sq.where(cb.equal(auth.get("target"), target));
List<Predicate> predicates = new ArrayList<Predicate>();
if (target != null)
	predicates.add(cb.equal(subs.get("target"), target));
						
predicates.add(subs.get("Auths").get("authId").in(sq));

c.where(predicates.toArray(new Predicate[predicates.size()]));

E o único mapeamento que existe é unidirecional, de Subs para Auth:

@OneToMany(fetch=FetchType.EAGER)
@JoinColumn(name="SubsIdAuth")
private List<Auth> Auths;

Isto funciona, porém o OpenJPA faz o seguinte:

FROM tab_subs t0 INNER JOIN tab_auth
t1 ON t0.CodSubs = t1.SubsId INNER JOIN 
tab_auth t5 ON t0.CodSubs = 
t5.SubsId

Alguém sabe como evitar este segundo join?

Criado 21 de janeiro de 2013
Respostas 0
Participantes 1