Spring数据的结果与同一逻辑表达式不同

时间:2018-03-27 19:03:14

标签: sql postgresql hibernate spring-data spring-data-jpa

我正在使用spring数据存储库来构建Web应用程序。我使用@Query注释使用自定义查询的位置。当我使用以下查询时

select u from UserAdmin u where (u.firstName like :firstName% or:firstName is null)

在这种情况下,如果:firstName参数为null,则返回所有记录,否则只返回like语句的匹配记录。 (这是按预期工作

select u from UserAdmin u where  ( :firstName is null or u.firstName like :firstName% )

在这种情况下,如果:firstName参数为null,则查询返回所有记录,否则仅在u.firstName = :firstName条件为真时才返回记录。 (在此方案中Like语句未按预期工作)

有人可以解释这种行为的原因吗?

由于

1 个答案:

答案 0 :(得分:0)

这似乎是JDBC驱动程序的限制。

如果您的firstName参数实际上是null,您将在两个方案中获得所有记录,该查询将起作用。

但是当firstName具有值时,在将参数绑定到方案%中的查询时,JDBC驱动程序无法应用:firstName is null or u.firstName like :firstName%

看起来它优先于第一次null检查,但我不完全确定原因。

但为什么不能预先应用%而不是@Query,例如在查询中使用StringBuilder firstName,就像在

中一样
firstName.append('%') 

然后将Repository查询修改为

select u from UserAdmin u where  ( :firstName is null or u.firstName like :firstName )

StringBuilder参数可以轻松绑定到RestControllers请求参数,因此您不会有任何不必要的操作。

这可以帮助您实现理想的结果。