Как НЕ выбрать пустую строку - PullRequest
9 голосов
/ 05 августа 2010

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

1 Ответ

12 голосов
/ 05 августа 2010

Я думаю, что вы неправильно используете IS [NOT] EMPTY, который используется для проверки того, разрешается ли путь ассоциации коллекции в пустую коллекцию или имеет хотя бы одно значение.Из спецификации JPA:

4.6.11 Выражения сравнения пустой коллекции

Синтаксис использования оператора сравнения IS EMPTY в empty_collection_comparison_expression выглядит следующим образом:

collection_valued_path_expression IS [NOT] EMPTY

Это выражение проверяет, является ли коллекция, обозначенная выражением пути с набором значений, пустой (т. Е. Не имеет элементов).

Пример:

SELECT o
FROM Order o
WHERE o.lineItems IS EMPTY

Если значение выражения пути со значением коллекции в пустом выражении сравнения коллекции неизвестно, значение выражения пустого сравнения неизвестно.

По моему мнению, вы должны просто использовать оператор сравнения <>:

select distinct sys.ipAddress 
  from SystemLog sys 
 where sys.ipAddress is not null 
   and sys.ipAddress <> ''
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...