【问题标题】:Spring data different result for same logical expression相同逻辑表达式的弹簧数据不同结果
【发布时间】:2018-09-06 07:38:03
【问题描述】:

我正在使用 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 语句没有按预期工作)

谁能解释这种行为的原因?

谢谢

【问题讨论】:

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


【解决方案1】:

这好像是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 请求参数,因此您不会有任何不必要的操作。

这应该可以帮助您实现预期的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-09
    • 2022-06-10
    • 2021-04-29
    • 1970-01-01
    • 2019-08-28
    • 2015-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多