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,那么您根本不需要进行计数检查,因为插入要么有效,要么被拒绝为重复项。更少的代码,没有数据损坏的问题。
我有这个简单的查询:
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,那么您根本不需要进行计数检查,因为插入要么有效,要么被拒绝为重复项。更少的代码,没有数据损坏的问题。