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
[code]
CriteriaBuilder cb = manager.getCriteriaBuilder();
CriteriaQuery c = cb.createQuery(Subs.class);
Root subs = c.from(Subs.class);
Subquery sq = c.subquery(Number.class);
Root auth = sq.from(Auth.class);
sq.select(cb.max(auth.get(“authId”).as(Number.class)));
sq.where(cb.equal(auth.get(“target”), target));
List predicates = new ArrayList();
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()]));[/code]
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?