Select 来自 JdbcTemplate 的计数(*)查询 returns 与来自 SQL 终端的查询 运行 不同的值

Select count(*) query from JdbcTemplate returns different value than running the query from SQL terminal

我有这个简单的查询:

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 启动调用。

没有传入 ID (150) 的行。 当 运行 queryForObject 时,变量计数为 1 ,而当 运行 来自 SQL Developer it comes as 0!!

这是怎么回事?我错过了什么?

可能的原因

a) 您正在计算返回的行数(这是一个)而不是返回的那一行中的值

b) 你有一个未提交的插入事务,这意味着 SQL 开发者看不到它

但无论如何,您在评论中说“在我进行检查后我继续插入行”,那么您的方法无论如何都需要重新审视。

以下概念:首先查询是否存在,如果不存在则插入,基本上是有缺陷的,除非通过适当的数据库约束或类似的锁定机制对其进行备份。因为否则,您最终会遇到以下情况:

会话 1 - 检查是否存在,未找到任何内容,我们没问题,执行插入... 会话 2 - 检查是否存在,没有找到,我们没问题,执行插入... 会话 1 - 提交 会话 2 - 提交

瞧...当您只期望 1 个值时,您多次出现一个值。

如果您确实定义了适当的唯一 constraint/index,那么您根本不需要进行计数检查,因为插入要么有效,要么被拒绝为重复项。更少的代码,没有数据损坏的问题。