Изо всех сил пытается преобразовать запрос левого соединения в JPQL - PullRequest
0 голосов
/ 12 января 2012

Я изо всех сил пытаюсь преобразовать этот SQL-запрос

SELECT feature.*, rolefeature.roleId, rolefeature.permission 
    FROM feature 
        Left JOIN rolefeature 
            ON feature.featureId = roleFeature.featureId 
                and roleFeature.roleId = ?

, который отлично работает.

в JPQL.У меня есть это

select f, rf.role.roleId as roleId, rf.permission 
    from Feature f 
        LEFT JOIN f.roleFeatures rf 
            and rf.role.roleId = :roleId

, но, похоже, он жаловался на ключевое слово AND.Я немного растерялся.Если я использую WHERE вместо AND, он не возвращает правильные данные

Ответы [ 2 ]

1 голос
/ 12 января 2012

Прежде всего, предложение 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
0 голосов
/ 10 мая 2012

ON не поддерживается в JPA 2.0 JPQL, но является частью проекта JPA 2.1.

EclipseLink 2.4 Milestone уже предлагает поддержку ON,

http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Querying/JPQL#ON

...