2015-12-09 3 views
1

Я хочу получить все кортежи из таблицы, даже если они содержат нулевые поля, используя HQL. Логика объясняется следующим образом:HQL не извлекает результаты с нулевыми полями

«Если конкретное поле равно null, вернет кортеж, вместо этого, если он не является нулевым, проверьте предложение« где »запроса».

Я попытался написать запрос следующим образом, но на самом деле он не работает.

String query ="FROM Audit t WHERE (t.emp IS NULL OR t.emp.name LIKE '%')"; 
listaServer = entityManager.createQuery(query).getResultList(); 

Вот таблица аудита

| ID | EMP | STATE | 
*********************** 
| 1 | 150 | Active | 
| 2 | (null) | Active | 

и это таблица Emp

| ID | Name | 
************** 
|150 | Tom | 
|151 | John | 

Когда я выполнить запрос, он возвращает только первый кортеж таблицы аудита. Как я могу это исправить?

ответ

-1

На мой взгляд, это потому, что это выражение: t.emp.name LIKE '%' Чтобы оценить это выражение, спящий режим будет генерировать внутреннее соединение. Вы должны попытаться определить левое внешнее соединение между таблицами и запустить выделение в этой области. Что-то вроде этого:

SELECT t from Audit t LEFT JOIN t.emps e WHERE (t.emp IS NULL OR e.name LIKE '%') 
+0

Я попытался, как вы предложили мне, но у меня есть это исключение: ORA-25156: старый стиль внешнего соединения (+) не может быть используется с ANSI-соединениями – chris

+0

Используйте ON вместо WHERE в JOIN, WHERE устарели – janek

0

Я думаю, что вы не имеете требуемую HQL. Я думаю, вам понадобится внутреннее соединение, если есть связь между сущностями. Поэтому я хотел бы предложить ниже запрос

select a from Audit a join a.emp e where e is not null OR emp.name LIKE '%' 

Который должен идти, как

String query ="select a from Audit a join a.emp e where e is not null OR emp.name LIKE '%'"; 
listaServer = entityManager.createQuery(query).getResultList(); 
+0

Вместо внутреннего соединения с предложением where, которое проверяет не пустое поле, я должен использовать левое внешнее соединение для возврата кортежей с пустыми полями. Как я могу выполнить левое соединение в спящем режиме, не сталкиваясь со следующим исключением? ORA-25156: внешнее соединение старого стиля (+) не может использоваться с соединениями ANSI – chris