2012-09-12 85 views
4

由Hibernate 3.6的文檔:HQL '與' 子句中JPQL

你可能會提供額外的加入使用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=? 

我相信我」 m缺少HQL with的正確JPQL子句。

+0

來自Hibernate文檔:'HQL也定義了一個WITH子句來限定連接條件。同樣,這是HQL特有的; JPQL沒有定義這個特性。http://docs.jboss.org/hibernate/orm/4.1/devguide/en-US/html/ch11.html#d5e2705 – RinaldoPJr

+0

請注意,在Hibernate中,您可以在JPQL中使用'with'以及。 – axtavt

+0

@axtavt我試過了,它拋出IllegalArgumentException。 – kmansoor

回答

1

不,在JPQL中沒有這樣的功能。在JPA 2.1 topic list中提到支持加入特定條件:

- 支持具有ON條件的外連接;

所以也許JPQL將來會有。

1

但是你可以用標準的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()與限制對象作爲第四個參數的記錄幾乎沒有簽字去做。它工作得非常好,所以值得學習Criteria API來獲得功能。

1

JPA 2.1增加了對ON join的支持條件。

這也是比HQL'with'子句更好的名稱選擇。