在JPA中获取两个表的所有列与标准连接查询

问题描述 投票:2回答:2

我有连接两个表的标准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();

请帮助我。

jpa join criteria
2个回答
1
投票

你将不得不传递一个实体图,如下所述,作为一个提示来查询,并通过only root in 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.

1
投票

这真的很容易,如果我们使用 multiselect. 我将尝试用简单的语言来解释。

你已经创建了一个 CriteriaBuilder 但你需要给通用类型的 CriteriaQuery 对象[]类型,因为来自两个表的数据是不同的数据类型,所以我们将它们放入一个对象列表中。

CriteriaQuery<Object[]> criteria = criteriaBuilder.createQuery(Object[].class);

这意味着查询将以对象的形式从两个表中获取数据。

再进一步,你为类创建了Root FacturePoste 但你还需要让根为 FactureEntete 也是。

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,你可以根据自己的需要自定义查询。例子:我的这个方法不需要Join,你可以根据自己的需要定制查询。

criteria.multiselect(posteRoot,enteteRoot).where(cb.equal(posteRoot.get("id"), enteteRoot.get("posteId")));

例如: FacturePosteFactureEntete 被映射为FactureEntete是ManyToOne到FacturePoste,外键是 posteId 那么只有相关的数据才会被获取。

© www.soinside.com 2019 - 2024. All rights reserved.