使用Spring JdbcTemplate提取一个字符串。

31

使用JdbcTemplate查询,似乎找不到从表中获取一个字符串的方法。 这是MySQL返回的表格:

ID | STREET_NAME
------------------------
1  | Elm street

现在我该如何获取STREET_NAME的值呢?SQL总是仅返回一行,所以不必担心返回多行。

一些背景信息: INNER JOIN和COUNT在同一个查询中

使用Tony Stark的答案获取我的表格。

但是我怎样才能使用JdbcTemplate从中提取"Elm street"呢?

5个回答

59

如果您能提供您的SQL查询的样子,那将会很有帮助,但是假设它看起来像这样:SELECT STREET_NAME FROM table WHERE ID=1;

代码:

public String getStreetNameById(int id) {
    JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
    String sql = "SELECT STREET_NAME FROM table WHERE ID=?";

    String streetName = (String) jdbcTemplate.queryForObject(
            sql, new Object[] { id }, String.class);

    return streetName;
}

2
我肯定尝试了你的代码。它怎么知道你需要获取哪一列?它说:“列计数不正确:期望1,实际2” - Laszlo Lugosi
这是一个已弃用的功能,我正在阅读,有什么更新的解决方案吗?'queryForObject(java.lang.String, java.lang.Object[], java.lang.Class<T>)'已被弃用。 - mattsmith5
2
你可以使用以下代码:queryForObject(sql, String.class, id) - Jiyan Akgül

14

JdbcTemplate实现了JdbcOperations接口。

如果您查看JdbcOperations中的queryForObject javadocs,它声明:

已弃用。从5.3开始,请使用queryForObject(String, Class, Object...)

基本上,他们已经更改了方法签名,以摒弃方法签名中的Object[]参数,转而使用可变参数。请参阅相关的Github issue

您可以像这样使用新的方法签名重写@jlewkovich的答案:

public String getStreetNameById(int id) {
    JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
    String sql = "SELECT STREET_NAME FROM table WHERE ID=?";

    String streetName = (String) jdbcTemplate.queryForObject(
            sql, String.class, id);

    return streetName;
}

如何在SELECT语句中获取多列。 - Onic Team
1
@VedPrakash,这与之前解释的相同,但您需要使用某种行映射机制来构建对象。请参见此相关文章,其中有一些很好的示例。希望能对您有所帮助。 - jccampanero
String checkDuplicateFileQry = "select job_id, site_level_batch_id from toplevel_bulk_status where file_checksum ='" + checksum + "'"; logger.log(INFO, "checkDuplicateFileQry :: " + checkDuplicateFileQry); List<String> fileIdList = new ArrayList<>(); try { List<Map<String, Object>> uploadedFileId = ((ConnectionFactoryPostgresReaderImpl) cfPostgresReaderImpl).getConnection() .queryForList(checkDuplicateFileQry, new Object[] {checksum}); - Onic Team
我不想使用行映射器,我正在使用上面的代码,但是出现错误消息:列索引超出范围:1,列数为0。但是当我在我的数据库控制台中运行此查询时它返回了一行结果。 - Onic Team
我的查询有问题,在where条件中缺少问号标记。 - Onic Team
显示剩余4条评论

7
如果您想从表格中(或任何带有联接的查询)仅获取一列“字符串”,则必须指定该列的名称。
顺便说一下,使用SELECT * FROM TABLE是非常糟糕的做法。我敢打赌您之前肯定这样做过。
@JLewkovich 修改后的代码:
public String getStreetNameById(int id) {
  JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
  String sql = "SELECT STREET_NAME FROM table WHERE ID=?";

  String streetName = (String) jdbcTemplate.queryForObject(
        sql, new Object[] { id }, String.class);

  return streetName;
}

但是如果没有结果或者有多个结果怎么办呢?好好思考一下!

如果想要获取一个序列值(在Oracle中),这个应该可以工作。

public Long getSequence() {
  Long seq;
  String sql = "select SEQ_XY.NEXTVAL from dual";
  seq = jdbcTemplateObject.queryForObject(sql, new Object[] {}, Long.class);
  return seq;
}

2
如果你使用queryforobject方法并且没有返回结果,它将抛出一个EmptyResultDataAccessException异常。建议使用query方法来正确处理这种情况。 - Dot Batch
这是一个已经过时的内容,我正在阅读,请问有什么更新的解决方案吗?'queryForObject(java.lang.String, java.lang.Object[], java.lang.Class<T>)'已经被弃用。 - mattsmith5

3

根据最新规范,以下语法的queryForObject现已弃用

<T> T   queryForObject(String sql, Object[] args, Class<T> requiredType)

新方法使用可变参数

<T> T   queryForObject(String sql, Class<T> requiredType, Object... args) 
更新的解决方案:我们需要将类类型替换为Object args,反之亦然。

SQL查询:SELECT STREET_NAME FROM table WHERE ID=1;

public String getStreetNameById(int id) {
    JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
    String sql = "SELECT STREET_NAME FROM table WHERE ID=?";

    String streetName = (String) jdbcTemplate.queryForObject(
            sql, String.class, new Object[] { id });

    return streetName;
}

0

我通常这样做:

String result = DataAccessUtils.singleResult(
    jdbcTemplate.queryForList(
        "SELECT street_name FROM table WHERE id = :id",
        Collections.singletonMap("id", id),
        String.class
    )
)

queryForList 用于处理空结果,而不是使用 queryForObject。对于空结果,queryForObject 会抛出 EmptyResultDataAccessException 异常,这通常不是期望的行为。

DataAccessUtils.singleResult + queryForList:

  • 如果结果为空,则返回 null
  • 如果恰好找到一行,则返回单个结果
  • 如果找到多行,则抛出异常。对于主键/唯一索引搜索,不应该发生这种情况

DataAccessUtils.singleResult


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接