【问题标题】:return a boolean - jdbcTemplate返回一个布尔值 - jdbcTemplate
【发布时间】:2014-05-16 14:35:59
【问题描述】:

我想用这个方法返回一个布尔值:

public Boolean isSizeOk(String transactionId){ 
    String sqlQuery = "SELECT true FROM customer_pool WHERE id = "+ transactionID + " AND level = 13)";

//The next line is the problem. 
    //If I am returning a Boolean List, I can write

    List <Boolean> sizeResult = jdbcTemplate.queryForList(sqlQuery, Boolean.class, transactionId);

    //But since I only want a boolean value, what will the statement be?
     Boolean sizeResult = jdbcTemplate......?

    return sizeResult;
}

请帮助。谢谢。

【问题讨论】:

  • 非常感谢...您的解决方案都是正确的。我现在不知道将正确答案授予谁:)。感谢您的帮助!

标签: boolean return jdbctemplate


【解决方案1】:

案例 1:如果您返回布尔值: 只需检查 sizeResult 列表的 size,如果 size 大于 0 返回 true 否则返回 错误

案例 2:如果您要返回布尔列表,则返回类型必须是布尔列表。您必须 把方法写成:

public List<Boolean> isSizeOk(String transactionId, int sizeLimit){ 
String sqlQuery = "SELECT true FROM customer_pool WHERE id = ? AND level = 13)";


List <Boolean> sizeResult = jdbcTemplate.queryForList(sqlQuery, Boolean.class, transactionId);

 Boolean sizeResult = jdbcTemplate......?

return sizeResult;

}

【讨论】:

  • 谢谢阿卡什。是的,当我将值作为布尔列表返回时它确实有效,但是没有理由将它作为列表返回,因为我知道我想要的答案是 TRUE 或 FALSE。这就是为什么我想要一种正确的方法将它作为布尔值返回,而不是作为布尔列表。
  • 那么就可以使用案例1的方案了。
【解决方案2】:

如果您想编写一个方法来检查数据库中是否存在记录,您可以使用以下代码:

Integer cnt = jdbcTemplate.queryForObject(
    "SELECT count(*) FROM customer_pool WHERE id = ? AND level = 13)", Integer.class, id);
return cnt != null && cnt > 0

【讨论】:

  • 好吧,这看起来不错。但是如果记录不存在它会返回什么?
  • 查询将返回 0 并且 "cnt != null && cnt > 0" 将返回 false
  • @orbfish,我的原始答案中有错误(缺少 id 参数)。我已经更正了答案。希望现在很清楚。
  • 难道 cnt != null 是多余的,因为 Count(*) 将始终返回一个整数?
  • count(*) 将读取所有匹配记录,添加limit 1 作为优化,以便数据库在找到第一条记录后可以停止计数。
【解决方案3】:

怎么样

// Change query accordingly
String query = "SELECT 1 FROM " + tableName + " WHERE " + idColumnName + " = ? LIMIT 1";
try {
    jdbcTemplate.queryForObject(query, new Object[]{id}, Long.class);
    return true;
} catch (EmptyResultDataAccessException e) {
    return false;
}

【讨论】:

    【解决方案4】:

    在 SQL 中计算行数只是为了获得关于结果非空的简单信息可能是不必要的矫枉过正,您只想询问第一行的结果集并完成。对于通过主键或其他索引进行的简单查询,性能可能相似,但是,对于复杂查询或全表扫描查询,性能可能会很慢。在 Spring 中我更喜欢简单的实用方法

    public boolean exists(String sql, Object... args) {
        boolean result = query(sql, args, new ResultSetExtractor<Boolean>() {
            @Override
            public Boolean extractData(ResultSet rs) throws SQLException,DataAccessException {
                boolean result = rs.next();
                return result;
            }
        });
        return result;
    }
    

    (谷歌“sql 存在 vs 计数”以获取更多信息。)

    【讨论】:

    • 我认为值得一提的是,在 Java 8 中这可以写成“return jdbcTemplate.query(searchQuery, args, ResultSet::next)”
    • 这应该被标记为正确答案,尽管它必须是return result.getBoolean(1),因为如果新的当前行有效,next() 就会返回——您仍然需要读取该行中的值。
    • @dehumanizer 我不完全理解你的意思。根据 javadoc,当调用下一个方法返回 false 时,光标位于最后一行之后。 所以我认为 rs.next() 的第一次调用在非空结果集 false 上返回 true在空结果集上。这与结果集中实际包含哪些列无关。 getBoolean(1) 假定查询的第一列类型为 boolean(或者可能可转换为 boolean),这(1)限制性太强,(2)例如在 Postgres 上对 select false 产生错误的结果。
    • @TomášZáluský,我的意思是,例如,如果您进行select exists (...) 类型的查询,那么即使select exists 查询返回false,您也将始终得到true,因为只是@987654334 @ 只会移动光标。
    • @dehumanizer 方法的目的是检查结果是否有行,仅此而已。我的目标是不对传入参数的 SQL 施加任何限制,假设它返回一些数据,例如select * from all_the_things。如果你自己包装这样的查询,即select exists (select * from all_the_things),你实际上将评估的负担转移到 SQL 引擎上并且查询返回元数据而不是数据,因此你不需要这种形式的方法,或者你必须阅读 getBoolean(1)。我不确定这种方法是否让事情变得更简单,考虑到 SQL 性能和字符串连接。
    猜你喜欢
    • 1970-01-01
    • 2021-07-31
    • 1970-01-01
    • 2021-03-21
    • 1970-01-01
    • 2013-08-18
    • 2014-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多