代码之家  ›  专栏  ›  技术社区  ›  Shervin Asgari

如何不选择空字符串

  •  9
  • Shervin Asgari  · 技术社区  · 14 年前

    我们有以下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 回复  |  直到 14 年前
        1
  •  12
  •   Pascal Thivent    14 年前

    我认为你滥用了 IS [NOT] EMPTY 用于检查 集合关联路径 解析为空集合或至少有一个值。根据JPA规范:

    4.6.11空集合比较表达式

    使用的语法 比较运算符 是空的 在一个 空的\集合\比较\表达式 如下:

    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 <> ''