oracle
  • jdbc
  • spring-jdbc
  • 2013-05-04 46 views 0 likes 
    0

    我有一个奇怪的问题, 我的查询如下所示。弹出jdbcTemplate执行查询

    String tokenQuery = "select id from table 
             where current_timestamp between 
           creation_time and (creation_time + interval '10' minute) 
            and token = '"+Token+"'"; 
    

    但是当我运行,jdbcTemplate.queryForLong(tokenQuery),不管是什么,它总是抛出EmptyDataAccessException。 我在Oracle中执行此操作 我们不能将动态值附加到字符串,然后将其作为查询传递并执行吗? 可能是什么问题?

    回答

    0

    我认为你得到的实际上是一个EmptyResultDataAccessException。这个异常的javadoc如下所示:

    当预期结果至少有一行(或元素),但实际返回零行(或元素)时,会抛出数据访问异常。

    这只是意味着查询执行正常,应该返回一行,但不返回任何。所以没有行满足您的查询条件。

    如果这是预期的,那么捕捉异常,或使用返回列表而不是返回单个值的方法。这样,您可以测试返回的列表是否为空。

    也就是说,您应该使用参数化查询,而不是像您所做的那样连接令牌。这将防止SQL注入攻击。例如,即使令牌包含报价,它也可以工作。

    +0

    感谢您的回复。 Infact如果我直接使用sqldeveloper运行相同的查询(我在调试时复制),它将返回一行和一列。这让我感到困惑。是单引号还是queryForLong()以不同于预期的方式工作? – 2013-05-05 04:04:27

    +0

    我会先检查令牌。你确定它是正确的大写。你确定它没有任何尾随的空白空间等 – 2013-05-05 06:18:29

    相关问题