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)
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?