这是我一直在摸不着头脑的事 - 特别是因为它真的很难处理。
请考虑以下代码:
String query = "UPDATE ORDERS SET VOLUME=?,CONTRACT_ID=?,PROJECT_ID=?,WORKSITE_ID=?,DROPZONE_ID=?,DESCRIPTION_ID=?,MANAGER_ID=?,DELIVERY_DATE=?,REVISION=REVISION+1) WHERE ID=?";
jdbcTemplate.update(query, orderEntity.getVolume(), orderEntity.getContractNo(), orderEntity.getProjectID(), orderEntity.getWorksiteID(), orderEntity.getDropzoneID(), orderEntity.getDescriptionID(), orderEntity.getManagerID(), orderEntity.getDeliveryDate(), id);
我们可以看到SQL查询不正确 - 因此会抛出一些SQL错误但是可能错过了。 Spring(对我来说)会抛出QueryTimeoutException
来回应这个问题。我对此很好,但没有用。
现在让我们试试
String query = "INSERT INTO ORDERS(ID,REISION,CONTRACT_ID,PROJECT_ID,WORKSITE_ID,DROPZONE_ID,DESCRIPTION_ID,MANAGER_ID,VOLUME,DELIVERY_DATE) VALUES(?,?,?,?,?,?,?,?,?,?)";
jdbcTemplate.update(query, id, revision, etc);
另一个容易错过的拼写错误 - REVISION错误拼写为REISION)Spring再次抛出另一个QueryTimeoutException
。现在这意味着,如果我得到这个例外,我实际上并不知道它是什么。这是语法错误吗?这是列拼写错误吗?是否(更难注意到)不遵循外键约束的事实?
在调试时,这可能是最令人愤怒的事情 - 我所知道的是我的查询无法运行。我怎样才能得到有用的东西?我的pom.xml
文件中是否有我未添加的内容?
编辑:
这是一个更好的例子。我有一个DESCRIPTIONS
表,带有ID,REVISION和TEXT列。所有这些都被标记为不可为空。
DescriptionEntity descriptionEntity = new DescriptionEntity("newDesc", 1, null);
String query = "INSERT INTO DESCRIPTIONS (ID,REVISION,TEXT) VALUES(?,?,?)";
jdbcTemplate.update(query, descriptionEntity.getID(), 1, descriptionEntity.getText());
这也会引发查询超时异常,当在mysql中运行查询时,我会ERROR 1048 (23000): Column 'TEXT' cannot be null
这是礼貌地说,有点痛苦。
答案 0 :(得分:2)
在第一个例子中,这不是拼写错误,因为你遗漏了开场白。我想说这不是Spring或JDBC的问题,而是你的数据库正在尝试处理SQL,等待更多输入或其他东西,并且永远不会返回。
在第二部分中,由于我不知道桌面设计,我不确定你在说什么。我必须假设你的意思是ID不是唯一的吗?同样,我不会责怪Spring或JDBC,也许是驱动器,很可能是数据库服务器。
请记住,在很多情况下,在用户客户端UI中处理SQL的方式与通过JDBC处理SQL的方式不同。例如,在SQL Server中,SQL被设置为字符串,传入的参数设置为变量,并使用sp_executesql()来运行它。我发现当我的报告通过SQL Studio Manager客户端运行得非常好时,但是当我运行它时会爆炸,因为查询计划优化器由于SQL的运行方式不同而采用了不同的路径。
答案 1 :(得分:0)
这很可能是我遇到过的最愚蠢的错误:问题在于Maven如何解决所有依赖关系。
Spring Security的要求放在JDBC要求之前。这使得Spring Security下拉org.springframework:spring-tx:jar:3.0.7.RELEASE:compile
,这满足了JDBC的依赖性。向上移动JDBC需求意味着JDBC下拉org.springframework:spring-tx:jar:3.2.2.RELEASE:compile
。