Прежде всего, предложение and
здесь не имеет смысла. Вы нуждаетесь в предложении where.
Во-вторых, запрос к rf.role
подразумевает внутреннее соединение между RoleFeature и Role. Вы увидите это, проверив сгенерированный SQL. Вам нужно сделать второе соединение слева, чтобы получить доступ к роли.
В-третьих, если вы наложите ограничение на идентификатор роли в предложении where, левое соединение станет внутренним соединением. Так что вам нужен эквивалент предложения on
в JPQL. Я не думаю, что JPQL имеет это, но Hibernate поддерживает это, используя ключевое слово with
:
select f, role.roleId as roleId, rf.permission
from Feature f
left join f.roleFeatures rf
left join rf.role role with role.roleId = :roleId
Может быть, вы можете смоделировать это с помощью
left join rf.role role
where role.roleId is null or role.roleId = :roleId