select count(*)从jdbctemplate查询返回的值与从sql终端运行查询返回的值不同

kcrjzv8t  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(284)

我有一个简单的问题:

sqlCount="  SELECT count(*)"+
            " FROM mytable "+
            " WHERE ID = ?"+
            " AND CANCEL_DATE IS NULL"+
            " AND LAST_NAME IS NOT NULL";

int count = jdbcTemplate.queryForObject(
                sqlCount, new Object[] { id }, Integer.class);

从spring boot呼叫。
没有传入id为(150)的行。运行queryforobject时,变量计数显示为1,而从sql developer运行同一查询时,变量计数显示为0!!
这是怎么回事?我错过了什么?

gwbalxhn

gwbalxhn1#

可能的原因
a) 您计算的是返回的行数(即1行),而不是返回的一行中的值
b) 您有一个未提交的insert事务,这意味着sqldeveloper无法看到它
但不管是什么情况,您的评论中说“在我做了检查之后,我继续插入行”,那么您的方法无论如何都需要重新访问。
“先查询是否存在,如果不存在则插入”的概念基本上是有缺陷的,除非通过适当的数据库约束或类似的锁定机制对其进行备份。否则,你会陷入这样的境地:
第1部分-检查是否存在,没有发现,我们没事,做插入。。。第2部分-检查是否存在,没有发现,我们没事,做插入。。。会话1-提交会话2-提交
瞧…当你只期望1的时候,你有一个值的多次出现。
如果确实定义了适当的唯一约束/索引,那么根本不需要进行计数检查,因为插入要么有效,要么作为副本被拒绝。代码更少,没有数据损坏的问题。

相关问题