JPQL中的HQL'with'子句

时间:2012-09-12 18:14:09

标签: hibernate hql jpql

来自Hibernate 3.6文档:

  

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

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 with的正确JPQL子句。

3 个答案:

答案 0 :(得分: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以获得功能。

答案 1 :(得分:1)

不,JPQL中没有这样的功能。 JPA 2.1 topic list中提到了支持加入特定条件:

  

- 支持ON条件的外连接;

所以也许JPQL将来会有它。

答案 2 :(得分:1)

JPA 2.1增加了对ON join条件的支持。

它也是比HQL更好的名称选择&#39;子句。