0

我目前在 Spring Data CrudRepository 中有以下方法签名:

@Query("SELECT c FROM Table c WHERE (:paramOne is null or c.fieldOne = :paramOne) AND (:paramTwo is null or c.fieldTwo = :paramTwo)")
    Iterable<Table> findByParamOneAndParamTwo(@Param("paramOne") Integer p1, @Param("paramTwo") Integer p2);

这被 Hibernate 翻译成(简化的):

select * where (? is null or fieldOne=?) and (? is null or fieldTwo=?)

我用它来获得一个既可以过滤表又可以返回所有记录的方法。

我的问题是,当我尝试执行存储库的方法时,我得到一个负面的 417 (-417) Db2 错误。谷歌搜索它说这意味着

要准备的语句字符串包括参数标记作为同一运算符的操作数(例如:?>?)

即使我的 Hibernate 查询没有这样做。

4

1 回答 1

0

也许您需要将逻辑推送到应用程序,以检查参数是否为空,因为 NULL 谓词不支持参数标记:“不得为表达式或在表达式中指定参数标记。” (https://www.ibm.com/support/knowledgecenter/SSEPEK_11.0.0/sqlref/src/tpc/db2z_nullpredicate.html)。SQLCODE -417 的消息文本可以改进。

于 2019-12-13T16:48:15.297 回答