Java 如何发现隐式多重根

Java 如何发现隐式多重根,java,hibernate,jpa,jpa-2.0,criteriaquery,Java,Hibernate,Jpa,Jpa 2.0,Criteriaquery,以下是我的展示案例代码: CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery<Tuple> q = cb.createTupleQuery(); Root<AA> aa = q.from(AA.class); q.multiselect(aa.get("id").alias("id"), articolo.get("a").alias("a"), articolo.get("b").alias("b")

以下是我的展示案例代码:

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Tuple> q = cb.createTupleQuery();
Root<AA> aa = q.from(AA.class);

q.multiselect(aa.get("id").alias("id"),
articolo.get("a").alias("a"),
articolo.get("b").alias("b"),
articolo.get("c").get("t").alias("c"),
articolo.get("d").alias("d"));

System.out.println("RootCount: "+q.getRoots().size());

Query query = em.createQuery(q);
List<Tuple> list = query.getResultList();
所以…两个根,但是q.getRoots()只报告我明确定义的一个


我怎样才能得到真正的根呢?

你只有一个根。也就是说,没有什么可以阻止您声明多个根并手动加入它们

Root<AA> aa = query.from(AA.class)
Path<CC> aaToCc = aa.get("c");
Root<CC> cc = query.from(CC.class)

cb.where(cb.equal(aaToCcId, cc));
Root aa=query.from(aa.class)
路径aaToCc=aa.get(“c”);
Root cc=query.from(cc.class)
cb.式中(cb.等于(aaToCcId,cc));

诀窍是,你并不真的需要CC根。您可以像根一样使用路径。或者,您可以使用
aa.join

添加的JPA标记,这不是Hibernate标准API,而是JPA 2标准API(即使Hibernate是提供程序)。是的,查询在没有CC根的情况下也可以工作,但当我使用getRoots()时,使用它时没有CC的迹象。
Root<AA> aa = query.from(AA.class)
Path<CC> aaToCc = aa.get("c");
Root<CC> cc = query.from(CC.class)

cb.where(cb.equal(aaToCcId, cc));