如何不选择空字符串

She*_*ari 9 java mysql orm jpa

我们有以下JPQL:

Select distinct sys.ipAddress from SystemLog sys where sys.ipAddress is not null and sys.ipAddress is not empty
Run Code Online (Sandbox Code Playgroud)

这会产生以下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_
        )
    )
Run Code Online (Sandbox Code Playgroud)

这显然不起作用并返回空字符串而不是省略它.但是,我正在寻找生成这样的东西:

select distinct ipAddress from SystemLog where ipAddress is not null and ipAddress <> '';
Run Code Online (Sandbox Code Playgroud)

但是,我无法弄清楚为什么我们的jpa查询不能生成像这样的类似的东西.有任何想法吗?

Pas*_*ent 12

我认为您滥用IS [NOT] EMPTY它是用于检查集合关联路径是否解析为空集合或至少有一个值.从JPA规范:

4.6.11空集合比较表达式

empty_collection_comparison_expression中使用比较运算符IS EMPTY的语法 如下:

collection_valued_path_expression IS [NOT] EMPTY
Run Code Online (Sandbox Code Playgroud)

此表达式测试由集合值路径表达式指定的集合是否为空(即,没有元素).

例:

SELECT o
FROM Order o
WHERE o.lineItems IS EMPTY
Run Code Online (Sandbox Code Playgroud)

如果空集合比较表达式中的集合值路径表达式的值未知,则空比较表达式的值是未知的.

在我看来,你应该只使用<>比较运算符:

select distinct sys.ipAddress 
  from SystemLog sys 
 where sys.ipAddress is not null 
   and sys.ipAddress <> ''
Run Code Online (Sandbox Code Playgroud)