我们有以下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查询不能生成像这样的类似的东西。 有任何想法吗?
答案 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 <> ''