当前位置: 首页 > 面试题库 >

休眠:无法执行本机批量操作查询

董意蕴
2023-03-14
问题内容

尝试使用本机SQL更新数据时出现此错误。这是我的脚本:

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

wns是包含多个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())时,会引发以下错误:

请求处理失败;嵌套的异常是org.hibernate.exception.DataException:无法执行本机批量操作查询],根本原因是com.mysql.jdbc.MysqlDataTruncation:数据截断:截断了错误的DOUBLE值:‘222,226,228,251,256,262,263,264,265,266,267,272,281,286,294,296,299,301,303,302,373,302

是因为输入字符串太长?


问题答案:

在数据库中使用参数化查询(预备语句)时,为参数分配值不得更改查询的结构和执行路径(否则数据库不会将其视为参数化查询,并且会引发异常)。

这就是为什么您不能为查询准备语句的原因:

  • 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没有抛出异常,您的数据库也会抛出异常。



 类似资料:
  • 在jboss consol中,我有这样一个错误: 但是当我使用sqldevelopper时,我没有任何问题

  • 问题内容: 我想按数据库中的条件计数记录数。 我尝试使用下一个查询 但是没有方法可以执行此操作并获得结果。 我知道,我可以使用 所以问题是,查询是否具有更高的性能?如果,那么如何执行查询呢? 问题答案: 您可以通过调用来执行第一个查询,例如。 如果要将计数分配给变量,则需要将其转换为适当的类型(它可以取决于DB,但很可能是Long)。第二个查询效率很低,因为Hibernate需要从数据库中检索整个

  • 问题内容: 这是我在阅读有关jpa批量插入的几个主题之后创建的简单示例,我有2个持久对象User和Site。一个用户可以拥有多个站点,因此我们在这里有一对多的关系。假设我要创建用户并将多个站点创建/链接到用户帐户。考虑到我愿意为Site对象使用批量插入,代码如下所示。 但是,当我运行此代码时(我将hibernate方式用作jpa实现提供程序),我看到以下sql输出: 所以,我的意思是“真实的”批量

  • 使用telnet也可以连接redis-server。并且在脚本中使用nc命令进行redis操作也是很有效的: gnuhpc@gnuhpc:~$ (echo -en "ping\r\nset key abc\r\nget key\r\n";sleep 1) | nc 127.0.0.1 6379 +PONG +OK $3 abc 另一个方式是使用pipeline: 在一个脚本中批量执行多个写入操作:

  • 问题内容: 该程序一个接一个地执行数以万计的连续插入。我以前从未使用过Hibernate。我的性能变得非常慢(如果我只是手动连接并执行SQL,则速度会提高10-12倍。根据许多休眠教程,我的batch_size设置为50。 这是单个插入的日志-也许您可以帮助我准确了解正在发生的事情: 问题答案: 当您调用时,hibernate将生成一个INSERT SQL。该INSERT SQL将附加在刷新期间(

  • 问题内容: 我正在将JPA持久性提供程序从EclipseLink 2.3切换到Hibernate 3.6.5.Final。问题出在本机查询上。注意:这不是EclipseLink的问题。我试图从我没有为其声明实体的表中获取一个标量值。这是代码: 使用Hibernate会得到一个,因为返回的对象实际上是一个代理对象。我不知道它是什么类型,但是我知道它不是数组(是false),我也不是列表(is )。