Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

HQL 'with' clause in JPQL

From Hibernate 3.6 documentation:

You may supply extra join conditions using the HQL with keyword.

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

This with clause allows to add a restriction on the JOIN condition (ON clause). Is there any such thing in JPQL?

When I run the following JPQL:

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

The following SQL is generated:

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

What should really get generated is:

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

I am sure I'm missing the right JPQL clause for HQL's with.

like image 938
kmansoor Avatar asked Sep 12 '12 18:09

kmansoor


2 Answers

But you can do it with 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(); 

This is the barely documented signature of Criteria.createAlias() with a Restriction object as the fourth parameter. It works so well that it is worth learning Criteria API to get the functionality.

like image 170
carbontax Avatar answered Oct 10 '22 07:10

carbontax


JPA 2.1 added support for ON join conditions.

It's also a better name choice than the HQL 'with' clause.

like image 44
Vlad Mihalcea Avatar answered Oct 10 '22 08:10

Vlad Mihalcea