如何不选择空字符串

时间:2010-08-05 15:07:15

标签: java mysql jpa orm

我们有以下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 个答案:

答案 0 :(得分:12)

我认为您误用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 <> ''