【问题标题】:Null and Empty Check for a IN Clause parameter for Spring data jpa @query?空和空检查 Spring 数据 jpa @query 的 IN 子句参数?
【发布时间】:2020-03-13 13:40:51
【问题描述】:

我基于某些搜索条件从数据库获取数据的 Spring 数据 JPA 代码不起作用。我的数据库是 SQL Server 2012,相同的查询似乎适用于 MYSQL DB。

代码示例:

@Query(value = "select * from entity e where e.emp_id=:#{#mySearchCriteria.empId} and ((:#{#mySearchCriteria.deptIds} is null or :#{#mySearchCriteria.deptIds} ='') or e.dept_id in (:#{#mySearchCriteria.deptIds})) ", nativeQuery = true)
public List<Entity> search(@Param("mySearchCriteria") MySearchCriteria mySearchCriteria);

如果 list mySearchCriteria.deptIds 有多个值 - 它不起作用(它实际上将其转换为错误的查询。任何线索?提前致谢。

注意:deptIds 的数据类型是整数列表

【问题讨论】:

  • 它会产生什么错误信息? mySearchCriteria.deptIds 字段的类型是什么?
  • @Woworks 它实际上是整数列表,错误日志显示 - 结果未转换为布尔值
  • 日志中的确切错误消息是:“消息”:“在预期条件的上下文中指定的非布尔类型的表达式,靠近 ','。”

标签: spring spring-boot sql-server-2012 spring-data-jpa spring-data


【解决方案1】:

它的抱怨是因为{#mySearchCriteria.deptIds} 的值是逗号分隔的列表,例如'Value1', 'Value2' 所以查询被翻译为 ('Value1', 'Value2' is null) 导致这个错误。

需要验证列表是否为空,然后更改带有IN子句的查询和不带IN子句的查询。

【讨论】:

  • 不能一次查询?如果 list 本身为 null 或为空,mysql 也会处理,它是否特定于 SQL Server 2012,它没有处理?
  • 不是特定于 sql server。参考stackoverflow.com/questions/2488930/…
  • ,我的问题是,当我使用相同的代码库(没有对列表对象的空检查)和不同的 mysql 连接器连接到 MySql DB 时,它可以工作(我的意思是如果列表为空,它不会将其添加到查询中),但是如果我将方言、连接器和数据库更改为 MSSQL 服务器,它会将其添加到查询中,并且我的查询结果为空结果集。
  • 我不明白.. 我以为你收到了An expression of non-boolean type specified in a context where a condition is expected, near ',' 的错误消息。所以你的意思是相同的查询在 MySQL 和 MsSQL 上的工作方式不同?
  • 是的,你是对的。我的应用程序在 mysql 上运行良好,我正在迁移到 sql server,所以现在一些查询失败了
【解决方案2】:

用括号将列表括起来。这对我有用。

(:#{#mySearchCriteria.deptIds}) is null

【讨论】:

    猜你喜欢
    • 2020-10-14
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    • 2019-05-30
    • 2015-07-25
    • 1970-01-01
    • 2021-11-13
    相关资源
    最近更新 更多