Разница QueryDSL между явным соединением и предложением where?

Скажем, у вас есть запрос QueryDSL следующим образом:

JPQLQuery query = new JPAQuery(em);
QUser user = QUser.user;
QLocation location= QLocation.location;

query.from(User).innerJoin(user.location, location).where(user.name.eq("Giuseppe").and(location.name.eq("Vatican City")));

Чем это отличается (функционально) от следующего?

JPQLQuery query = new JPAQuery(em);
QUser user = QUser.user;

query.from(User).where(user.name.eq("Giuseppe").and(user.location.name.eq("Vatican City")));

Мне кажется, что оба могут решить условие о том, что местоположение пользователя должно быть Ватиканом. Кроме того, оба возвращают объекты, позволяющие перемещаться по графу объектов.

Так есть ли разница? Почему бы просто не использовать второй, более компактный?

Редактировать: они генерируют разные JPQL, это точно, но я не уверен, что конечный результат отличается. Зачем нам когда-либо явно указывать, какое объединение мы делаем?

Изменить 2: кажется, что они могут быть идентичны... http://docs.jboss.org/hibernate/orm/4.2/devguide/en-US/html/ch11.html#d5e2888


person Michael Tontchev    schedule 20.02.2015    source источник


Ответы (1)


Для записи, неявные соединения в предложениях where выполняют внутреннее соединение. Согласно форуму QueryDSL, вы должны использовать явные соединения когда вы хотите повторно использовать соединения или использовать другие типы соединений помимо внутреннего соединения. В противном случае вы можете просто использовать предложения where.

person Michael Tontchev    schedule 05.05.2015