Почему оператор JPQL «ИЛИ» сужает набор результатов? - PullRequest
1 голос
/ 01 декабря 2011

У меня есть три таблицы: «Пользователь», «Сотрудник» и «Рабочий». Таблица «Пользователь» имеет отношение «один к нулю или один» с «Работником» и то же отношение «один к нулю или один» с «Сотрудником». Бин сущности пользователя имеет следующие атрибуты отображения:

@OneToOne(cascade = CascadeType.ALL, mappedBy = "user")
private Worker worker;
@JoinColumn(name = "id_employee", referencedColumnName = "id")
@OneToOne
private Employee idEmployee;

Моя цель состоит в том, чтобы получить все записи "Пользователя", у которых один из этих атрибутов заполнен (не ноль). Я пытаюсь использовать запрос:

SELECT u FROM User u WHERE u.idEmployee IS NOT NULL OR u.worker IS NOT NULL
ORDER BY u.login

Я предполагаю получить 15 записей, но получаю только 6. Я разделил этот запрос на две отдельные части:

SELECT u FROM User u WHERE u.idEmployee IS NOT NULL ORDER BY u.login;
SELECT u FROM User u WHERE u.worker IS NOT NULL ORDER BY u.login;

Я получаю 9 и 6 записей соответственно. Собрать вместе - требуется 15 записей. screenshot of queries and result sets

Похоже, "ИЛИ" сужает набор результатов только до тех записей, у которых рабочее поле не равно нулю. Почему это работает таким образом? Заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 01 декабря 2011

Рабочая ассоциация отображается внешним ключом в рабочей таблице.Это означает, что использование u.worker создает внутреннее соединение с рабочей таблицей, а is not null всегда имеет значение true.Результирующий SQL должен выглядеть следующим образом:

select u.* from user u, worker w where u.id = w.user_id and w.user_id is not null.

Вам нужно использовать левое объединение, чтобы принимать пользователей, у которых нет рабочего:

0 голосов
/ 22 мая 2012

Недавно у меня действительно была похожая проблема, и оказалось, что я использовал старую версию ссылки затмения, где операторы являются нулевыми и ненулевыми, неправильно выполнялись, если они были частью операторов и / или.Если я помню, исправить это было в ссылке затмения 2.2.0.если вы не используете ссылку затмения, игнорируйте мой пост.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...