获取两个表的所有列,并使用标准JPA连接

时间:2016-04-08 09:30:22

标签: jpa join criteria

我已加入两个符合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();

请帮帮我。

2 个答案:

答案 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")));

如果将FacturePosteFactureEntete映射为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.