我正在使用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
语句未按预期工作)
有人可以解释这种行为的原因吗?
由于
答案 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
请求参数,因此您不会有任何不必要的操作。
这可以帮助您实现理想的结果。