我已加入两个符合Jpa Api标准的表格。但我需要加入两个表的列:
CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
CriteriaQuery<FacturePoste> criteria = criteriaBuilder.createQuery(FacturePoste.class);
Root<FacturePoste> root = criteria.from(FacturePoste.class);
Join<FacturePoste, FactureEntete> contactInfoJoin = root.join("numeroFacture");
TypedQuery<FacturePoste> query = em.createQuery(criteria.multiselect(contactInfoJoin));list = query.getResultList();
请帮帮我。
答案 0 :(得分:1)
如果我们使用multiselect
,这真的很容易。我将尝试用简单的词来解释。
您已经创建了CriteriaBuilder
,但需要为CriteriaQuery
的通用类型指定Object []类型,因为来自两个表的数据都具有不同的数据类型,因此我们将将它们放入对象列表:
CriteriaQuery<Object[]> criteria = criteriaBuilder.createQuery(Object[].class);
这意味着查询将从两个表中获取数据作为对象。
再进一步,您为类FacturePoste
创建了Root,但还需要为FactureEntete
创建Root:
Root<FacturePoste> posteRoot = cq.from(FacturePoste.class);
Root<FactureEntete> enteteRoot = cq.from(FactureEntete.class);
现在,我们将对查询执行multiselect
操作:
criteria.multiselect(posteRoot,enteteRoot);
然后您可以执行TypedQuery
,但这里也可以使用Object []作为通用类型:
TypedQuery<Object[]> query = em.createQuery(criteria);
希望这会有所帮助!
PS:我的这种方法不需要Join,您可以根据需要自定义查询。示例:
criteria.multiselect(posteRoot,enteteRoot).where(cb.equal(posteRoot.get("id"), enteteRoot.get("posteId")));
如果将FacturePoste
和FactureEntete
映射为FactureEntete is ManyToOne到具有外键posteId
的FacturePoste,则将仅提取与ar相关的数据。
答案 1 :(得分:0)
您将必须传递如下所述的实体图,作为查询和传递的提示 仅根源于criteria.select(root)。
CriteriaBuilder criteriaBuilder =
em.getCriteriaBuilder();
CriteriaQuery<FacturePoste> criteria =
criteriaBuilder.
createQuery(FacturePoste.class);
Root<FacturePoste> root =
criteria.from(FacturePoste.class);
Join<FacturePoste, FactureEntete>
contactInfoJoin =
root.join("numeroFacture");
TypedQuery<FacturePoste> query =
em.createQuery(criteria.select(root));
// Create an entity graph with a subgraph
EntityGraph<FacturePoste> graph =
em.createEntityGraph(FacturePoste.class);
graph.addSubgraph("numeroFacture");
query.setHint("javax.persistence.fetchgraph",
graph);
list = query.getResultList();
Note:It will be better if you use static
meta model instead of passing entity feild.
names directly.