8

我有一个像下面这样的连接引用,它的第一个连接表达式是由 JPA API 自动构造的。

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Tuple> c = cb.createTupleQuery();
Root<Demand> demands = c.from(Demand.class);
Join<Demand, Metadata> joinMetadata = demands.join("metadatas", JoinType.LEFT);

但是,我想向我的 joinMetadata 添加一个附加条件,例如 Metadata.type="AFFECTATION_KEY" 但我不知道如何。

非常感谢您的帮助

4

2 回答 2

12

JPA

JPA 2.0 始终仅通过映射连接列连接,因为它不支持 ON 子句。另一方面,JPA 2.1 确实支持这一点:

... 
Join<Demand, Metadata> joinMetadata = demands.join("metadatas", JoinType.LEFT);
joinMetadata.on(cb.equal(joinMetadata.get("type"), "AFFECTATION_KEY"));

EclipseLink

EclipseLink 2.4 支持 ON 子句,

见, http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Querying/JPQL#ON

也可以通过 Criteria API,使用提供子句支持的 EclipseLink原生Expression API,on

见, http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Querying/Criteria#JpaCriteriaBuilder_and_EclipseLink_Extensions

于 2012-06-18T13:10:48.100 回答
7

Hibernate 的 Criteria API 3.6 版也支持它:

    Criteria c = session.createCriteria(Tuple.class);

    c.createAlias("demands", "d")
    .createAlias("d.metadata", "m", 
        Criteria.LEFT_JOIN, Restrictions.eq("m.type", "AFFECTATION_KEY"));

或者您可能需要 Restrictions.eqProperty() 最后一点。请注意带有第四个参数的 createAlias() 的低估版本。这是文档中的引用

参数:

  • AssociationPath - 一个点分隔的属性路径
  • alias - 分配给加入关联的别名(供以后参考)。
  • joinType - 要使用的连接类型。
  • withClause - 要添加到连接条件的条件(ON 子句)

休眠 API 3.6

于 2012-06-18T22:35:05.693 回答