У нас есть следующий JPQL:
Select distinct sys.ipAddress from SystemLog sys where sys.ipAddress is not null and sys.ipAddress is not empty
И это генерирует следующее утверждение mysql
.
select
distinct systemlog0_.ipAddress as col_0_0_
from
SystemLog systemlog0_
where
(
systemlog0_.ipAddress is not null
)
and (
exists (
select
systemlog0_.id
from
SystemLog systemlog0_
)
)
Это, очевидно, не работает и возвращает пустую строку вместо ее пропуска. Тем не менее, я ищу что-то вроде этого:
select distinct ipAddress from SystemLog where ipAddress is not null and ipAddress <> '';
Тем не менее, я не могу понять, почему наш запрос jpa не генерирует нечто похожее на это. Любые идеи?
Я думаю, что вы неправильно используете IS [NOT] EMPTY
, который используется для проверки того, разрешается ли путь ассоциации коллекции в пустую коллекцию или имеет хотя бы одно значение. Из спецификации JPA:
4.6.11 Выражения сравнения пустых коллекций
Синтаксис для использования оператор сравнения ПУСТО в пустое_коллекционное_сравнение_выражение выглядит следующим образом:
выражение_значение_путь_собрания ЕСТЬ [НЕ] ПУСТО
Это выражение проверяет, действительно ли коллекция, обозначенная возвращающее коллекцию выражение пути пустой (т.е. не имеет элементов).
Пример:
ВЫБРАТЬ o ОТ Заказать o ГДЕ o.lineItems ПУСТО
Если стоимость коллекции оценивается выражение пути в пустой коллекции выражение сравнения неизвестно, значение пустого сравнения выражение неизвестно.
На мой взгляд, вам следует просто использовать оператор сравнения <>
:
select distinct sys.ipAddress
from SystemLog sys
where sys.ipAddress is not null
and sys.ipAddress <> ''