Как НЕ выбрать пустую строку

У нас есть следующий 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 не генерирует нечто похожее на это. Любые идеи?

9
задан Pascal Thivent 6 August 2010 в 00:14
поделиться

1 ответ

Я думаю, что вы неправильно используете 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 <> ''
12
ответ дан 4 December 2019 в 19:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: