我有连接两个表的标准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();
请帮助我。
你将不得不传递一个实体图,如下所述,作为一个提示来查询,并通过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.
这真的很容易,如果我们使用 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")));
例如: FacturePoste
和 FactureEntete
被映射为FactureEntete是ManyToOne到FacturePoste,外键是 posteId
那么只有相关的数据才会被获取。