jdbcTemplate 查询行映射日期列一般

Posted

技术标签:

【中文标题】jdbcTemplate 查询行映射日期列一般【英文标题】:jdbcTemplate query row map date column generically 【发布时间】:2013-01-03 17:02:49 【问题描述】:

我有一个带有日期列的数据库,当我执行查询时,我将每一行作为列名到列值的映射。我的问题是我不知道如何一般地获取日期列。

我现在只是试图将其转换为字符串,然后将其解析为 java.util.Date,但在转换时出现此错误,否则我不确定如何获取数据?

此代码也应该适用于 Sybase 和 Oracle 数据库,因此非常感谢您提供通用答案!

private static final String USER_QUERY = "SELECT USERNAME, PASSWORD, SUSPEND_START_DATE, SUSPEND_END_DATE FROM USERS";

public User readUsers(Subjects subjects) throws SubjectReaderException 
    /* Perform the query */
    List<User> users = new ArrayList<User>();
    List<Map<String, Object>> rows = jdbcTemplate.queryForList(USER_QUERY);
    /* Map the returned rows to our User objects */
    for (Map<String, Object> row : rows) 
        String username = (String) row.get("USERNAME");
        /* Check if the user is suspended */
        if(checkUserIsSuspended(row))
            continue;
        
        User user = new User();
        user.setUsername(username);
        user.setPassword((String) row.get("PASSWORD"));
        users.add(user);
    
    return users;


private boolean checkUserIsSuspended(Map<String, Object> row) throws SubjectReaderException 
    final String startDateString = (String) row.get("SUSPEND_START_DATE"); // this errors
    if (startDateString != null) 
        final String endDateString = (String) row.get("SUSPEND_END_DATE");
        if (null != endDateString) 
            return checkDate(startDateString, endDateString); // this just compares the current date etc
        
        /* Return true if the Suspended start date is not null, and there is no end date column, or it is null */
        return true;
    
    /* Return false if the Suspended start date String is null - i.e. they have not been suspended */
    return false;

错误:

java.lang.ClassCastException: com.sybase.jdbc3.tds.SybTimestamp cannot be cast to java.lang.String

【问题讨论】:

【参考方案1】:

它总是会出现此错误,因为您将 Object com.sybase.jdbc3.tds.SybTimestamp 转换为 String。

为什么不直接在 SQL 中进行检查而不是创建过滤器?类似的东西

SELECT USERNAME, PASSWORD, SUSPEND_START_DATE, SUSPEND_END_DATE
    FROM USERS WHERE SUSPEND_START_DATE >= ?

现在您可以使用queryForList 作为参数传递当前时间。

另一种避免这种直接强制转换的方法是使用RowMapper。这样您就可以使用ResultSet#getDate(String),并且您不需要转换任何内容,因为 JDBC 驱动程序会为您处理转换:)

【讨论】:

谢谢!我最终使用了 RowMapper 和 jdbcTemplate.query(queryString, new UserRowMapper()),因为我们想保持 SQL 的通用性,但它的工作原理就像一个魅力! 酷 :D 很高兴我能提供帮助

以上是关于jdbcTemplate 查询行映射日期列一般的主要内容,如果未能解决你的问题,请参考以下文章

Spring利用spring的JdbcTemplate查询返回结果映射到自定义类型

如何使用 JdbcTemplate 检查表列是不是存在?

Spring Boot 2 + JdbcTemplate - 有没有办法为每个支持的数据库提供 SQL 查询?

Spring JdbcTemplate 查询参数类型错误:无效的列类型

sql查询计算不同列和相邻行的两个日期之间的差异

spring JdbcTemplate 查询,使用BeanPropertyRowMapper