【问题标题】:JdbcTemplate return UUID on insert "A result was returned when none was expected."JdbcTemplate 在插入时返回 UUID “预期没有结果时返回了结果。”
【发布时间】:2019-11-16 06:05:45
【问题描述】:

我的插入查询返回插入记录的 UUID。下面是相关代码。

KeyHolder keyHolder = new GeneratedKeyHolder();

template.update(connection -> {
    PreparedStatement ps = connection.prepareStatement(insertQuery);
    ps.setString(1, stateName);
    ps.setString(2, stateAb);
    ps.setObject(3, propertyDetailsObject);


    return ps;
}, keyHolder);

我正在使用一个以select id from tmpproperty limit 1; 结尾的长 CTE 查询,为了便于阅读,我在此处缩短了内容。

但我得到以下异常

org.springframework.dao.DataIntegrityViolationException: PreparedStatementCallback;没有结果时返回 预期的。;嵌套异常是 org.postgresql.util.PSQLException: A 结果在没有预期的情况下返回。

我在网上找到了上面的示例,并希望它能够工作。知道我应该做些什么不同的事情吗?

【问题讨论】:

  • insertQuery 中的查询是什么?为什么更新查询中有“select id ...”?这是您的错误:更新查询不应返回任何值,您在最后执行选择以返回最后一行 id。这不是更新查询的有效方案。
  • 您应该使用 INSERT...RETURNING,例如:INSERT INTO people (lastname,firstname) VALUES ('Smith', 'John') RETURNING id;

标签: java spring spring-boot spring-jdbc


【解决方案1】:

需要改成:

PreparedStatement ps =  connection.prepareStatement(youSQL, new String[]{"id"});

其中id 是主键列名

并删除select id from tmpproperty limit 1;,更新查询就足够了。

【讨论】:

  • 我正在使用 CTE 查询,我想我需要在 CTE 查询之后进行某种选择?这是完整的查询pastebin.com/eGDHDfUh 我总是想获取property.id,如果它刚刚插入,或者它已经存在。查询现在按预期工作。不知道如何修改它,所以不会有选择。
  • 我认为您的查询应该使用“执行”或“查询”方法执行,而不是“更新”。 JDBCTemplate 更新方法是为简单的单次插入而设计的,而不是你拥有的那么复杂的插入。
猜你喜欢
  • 1970-01-01
  • 2019-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-28
  • 2021-01-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多