java - Hibernate:无法执行 native 批量操作查询

标签 java mysql hibernate

我在尝试使用 native SQL 更新数据时遇到此错误。这是我的脚本:

update weight_note_receipt set pledge_id =:pledge  where wn_id in (:wns)

wns 是包含超过 1 个 wn_id 的字符串,如下所示:

222,226,228,251,256,262,263,264,265,266,267,272,281,286,294,296,299,301,302,303,306,307,330,332,333,337,338,339,341,368,371,376,377,378,379,380,381,385,391,397,423,424,443,452,454,461,462,463,464,490,503,504,521,525,528,529,530,532,533,549,554,560,561,564,565,566,567,569,570,595,598,600,603,605,606,607,644,646,649,653,661,662,663,667,669,678,683,752,1039,1075,258,259,260,261,268,269,270,287,304,305,308,325,334,604,643,647,648,659,660,664,665,666,704,709,753,754,757,758,809,834,846,861,872,879,882,911,913,916,919,920,164

当我更新时(使用 query.executeUpdate()),它会抛出以下错误:

Request processing failed; nested exception is org.hibernate.exception.DataException: could not execute native bulk manipulation query] with root cause com.mysql.jdbc.MysqlDataTruncation: Data truncation: Truncated incorrect DOUBLE value: '222,226,228,251,256,262,263,264,265,266,267,272,281,286,294,296,299,301,302,303,306,307,330,332,333,337,338,339,341,368,371,376,'

是不是输入的字符串太长了?

最佳答案

当在数据库中进行参数化查询(准备语句)时,为参数赋值不得更改查询的结构和执行路径(否则数据库不会将它们视为参数化查询并将抛出异常)。

这就是为什么您不能为以下查询准备语句:

  • select * from myTable order by ?
  • select id, f1, ? from myTable
  • select * from ? .

因为为每个参数赋值会改变查询执行路径(请记住,准备好的语句的查询被解析一次并产生单一执行路径)。

同样的规则适用于 Hibernate 查询解析器,你不应该为参数分配一个改变查询结构的值。

为字符串赋值 1, 2, 3到一个 SHOULD-TO-BE-A-NUMBER 参数是一样的,实际上第一个查询将被翻译成 update weight_note_receipt set pledge_id =:pledge where wn_id = :wns但第二个将被翻译为 update weight_note_receipt set pledge_id =:pledge where (wn_id = :x1 or wn_id = :x2 or wn_id = :x3) ,显然不同的查询具有不同的执行路径。

因此,即使 Hibernate 没有抛出异常,您的数据库也会抛出异常。

关于java - Hibernate:无法执行 native 批量操作查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20625692/

相关文章:

java - 正则表达式检查运行无限时间

java - 查找一组数字的特定大小的所有可能组合

Java 与 Javascript 正则表达式问题

mysql - 如何让 MySQL 5.5 中的工作查询在 MySQL 5.7 中工作?

java - hibernate - 表名定义

java - RxJava Observable 最短执行时间

php - MYSQL PHP查询将数据从一个表获取到另一个表

java - JPA存储库: How to multiply column value by parameter value

mysql - Hibernate 注释和继承

java - org.hibernate.id.IdentifierGenerationException : ids for this class must be manually assigned before calling save()