HQL中的'with'子句在JPQL中是什么?

7

从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=? 

我确定我缺少正确的JPQL子句来替代HQL中的with


Hibernate文档中提到:“HQL还定义了一个WITH子句来限定连接条件。这是特定于HQL的功能;JPQL不定义此功能。” http://docs.jboss.org/hibernate/orm/4.1/devguide/en-US/html/ch11.html#d5e2705 - RinaldoDev
请注意,在Hibernate中,您也可以在JPQL中使用with - axtavt
@axtavt 我试过了,它抛出了IllegalArgumentException异常。 - kmansoor
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以获取更多功能。

2
JPA 2.1增加了对ON join条件的支持。
这也比HQL中的'with'子句更好的命名选择。

1
不,JPQL中没有这样的功能。在JPA 2.1主题列表中提到了支持使用特定条件进行连接的功能:

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

所以也许将来JPQL会有这个功能。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接