How to combine PathBuilder with join(...).fetch()

889 views
Skip to first unread message

Ferran Maylinch

unread,
May 27, 2012, 9:19:42 PM5/27/12
to quer...@googlegroups.com
Hello,

I've been playing around with PathBuilder and fetch() in an scenario where I have two entities (User and Device) with a OneToOne relation between them.

I started with a simple query where I retrieve users with an english (en) device:

        QUser user = Quser.user;

        List<User> users = query.from(user)
                .where(user.device.language.eq("en"))
                .list(user);

Then I wanted to fetch Device properties so I did:

        QDevice device = QDevice.device;

         List<User> users = query.from(user)
                .innerJoin(user.device, device).fetch()
                .where(device.language.eq("en"))
                .list(user);


Then I tried to introduce a PathBuilder but I don't know how to use fetch:

        PathBuilder<User> devicePath = new PathBuilder<User>(User.class, "device");

         List<User> users = query.from(user)
                .innerJoin(devicePath).fetch()     <----- This join doesn't work
                .where(devicePath.get("language", String.class).eq("en"))
                .list(user);

That last query produces this error:

Exception in thread "main" org.hibernate.hql.ast.QuerySyntaxException: Path expected for join!
[select user
from may.tests.User user inner join User device where device.language = :a1]

It should say inner join Device but it says inner join User.

What am I doing wrong?

Thank you!
Ferran

Timo Westkämper

unread,
May 28, 2012, 12:41:02 PM5/28/12
to Querydsl on behalf of Ferran Maylinch
Hi.

On Mon, May 28, 2012 at 4:19 AM, Querydsl on behalf of Ferran Maylinch <quer...@googlegroups.com> wrote:
Hello,

I've been playing around with PathBuilder and fetch() in an scenario where I have two entities (User and Device) with a OneToOne relation between them.

I started with a simple query where I retrieve users with an english (en) device:

        QUser user = Quser.user;

        List<User> users = query.from(user)
                .where(user.device.language.eq("en"))
                .list(user);

Then I wanted to fetch Device properties so I did:

        QDevice device = QDevice.device;

         List<User> users = query.from(user)
                .innerJoin(user.device, device).fetch()
                .where(device.language.eq("en"))
                .list(user);


Then I tried to introduce a PathBuilder but I don't know how to use fetch:

        PathBuilder<User> devicePath = new PathBuilder<User>(User.class, "device");

         List<User> users = query.from(user)
                .innerJoin(devicePath).fetch()     <----- This join doesn't work
                .where(devicePath.get("language", String.class).eq("en"))
                .list(user);

It doesn't work because it your are joining to another top level variable which is not allowed in JPQL.

So devicePath sould be something like this

PathBuilder<Device> devicePath = user.get("device", Device.class);
 


That last query produces this error:

Exception in thread "main" org.hibernate.hql.ast.QuerySyntaxException: Path expected for join!
[select user
from may.tests.User user inner join User device where device.language = :a1]

It should say inner join Device but it says inner join User.

What am I doing wrong?

Thank you!
Ferran



--
Timo Westkämper
Mysema Oy
+358 (0)40 591 2172
www.mysema.com



Reply all
Reply to author
Forward
0 new messages