6

来自 Hibernate 3.6 文档:

您可以使用 HQL with 关键字提供额外的连接条件。

from Cat as cat
left join cat.kittens as kitten
    with kitten.bodyWeight > 10.0

with子句允许对 JOIN 条件(ON 子句)添加限制。JPQL中有这样的东西吗?

当我运行以下 JPQL 时:

select c from ContainerDef c left join fetch c.displayState ds where c.id = 1 and ds.user.id = 2

生成以下 SQL:

select
        ...
    from
        CONTAINER_DEF containerd0_ 
    left outer join
        USER_CONTAINERDEF displaysta1_ 
            on containerd0_.CONTAINERDEF_ID=displaysta1_.CONTAINERDEF_ID 
    where
        containerd0_.CONTAINERDEF_ID=? 
        and displaysta1_.AUTHUSER_ID=?

真正应该生成的是:

select
        ...
    from
        CONTAINER_DEF containerd0_ 
    left outer join
        USER_CONTAINERDEF displaysta1_ 
            on containerd0_.CONTAINERDEF_ID=displaysta1_.CONTAINERDEF_ID 
            and displaysta1_.AUTHUSER_ID=?
    where
        containerd0_.CONTAINERDEF_ID=? 

我确定我错过了 HQL 的正确 JPQL 子句with

4

3 回答 3

2

但是您可以使用 Criteria API 来做到这一点

    Criteria crit = session.createCriteria(Cat.class);
    crit.createAlias("kittens", "kitten", 
        Criteria.LEFT_JOIN, Restrictions.gt("weight", 10.0);

    List<Cat> catsWithFatKittens = crit.list(); 

Criteria.createAlias()这是以Restriction 对象作为第四个参数的几乎没有记录的签名。它运行良好,值得学习 Criteria API 来获得该功能。

于 2012-10-15T20:37:31.603 回答
2

JPA 2.1 添加了对ON 连接条件的支持。

它也是比 HQL 'with' 子句更好的名称选择。

于 2015-01-10T20:03:14.733 回答
1

不,JPQL 中没有这样的功能。JPA 2.1 主题列表中提到了对特定条件加入的支持:

-- 支持带有 ON 条件的外连接;

所以也许JPQL将来会有它。

于 2012-09-12T18:22:40.277 回答