类型不匹配:无法从List <map <string,object>&gt;转换列出<object>

时间:2016-01-04 18:01:51

标签: java spring jdbctemplate

我们有

 String sql = "SELECT * FROM user WHERE id = '" +userId +"'";
 List<Object> userList = template.queryForList(sql);

查询应返回具有给定id的不同用户。 templateJdbcTemplate类的对象 此处查询返回Map<String,Object>的列表,左侧是List<Object>。有没有办法进行转换。这是Spring事务管理示例的一部分。

3 个答案:

答案 0 :(得分:2)

您可以始终只使用您感兴趣的List<Object> userList = new ArrayList<Object>(template.queryForList(sql).values()); ,例如:

List<Map<String, Object>>

如果它返回Map<String,Object>而不是List < Object > userList = new ArrayList < Object > (); for (Map < String, Object > obj: template.queryForList(sql)) { userList.addAll(obj.values()); }

Object

这应该会根据您的需要为您提供Map.values()列表。如果您需要探究为什么ArrayList无法直接投放到列表中,我们需要为此目的创建新的PYTHONPATH,请访问:why HashMap Values are not cast in List

答案 1 :(得分:1)

我认为你应该采取另一种方法。 Spring无法从数据库返回的数据构建对象,但您可以使用RowMapper构造用户对象。此外,您不应该自己构建查询,而是使用PreparedStatement。否则,您可能容易受到SQL注入的攻击。<​​/ p>

以下是如何操作的示例:

template.query("SELECT * FROM user WHERE id = ?", new Object[] { userId }, new RowMapper<User>() {

    public User mapRow(ResultSet rs, int rowNum) {
        // Build a user from the current row and return it
    }

});

答案 2 :(得分:1)

我觉得你很困惑。最好的方法就是Steffen Kreutz所建议的。请考虑以下示例:

DB中的用户表具有以下字段:

1. UserID -> Type: Int
2. User_Name -> Type: Varchar
3. User_Contact -> Type: Varchar
...

现在,您可以简单地编写一个RowMapper来将所有这些字段映射到您的自定义POJO对象,如下所示:

POJO班级:

public class User{
     private int userId;
     private String userName;
     private String userContact;

     public int getUserId() {
          return this.userId;
     }

     public void setUserId(int userId) {
          this.userId = userId;
     }

     /* Other Getter-Setter(s) */
}

查询字符串:

private static final String SELECT_QUERY = "SELECT * FROM user WHERE id = ?";

JdbcTemplate调用: 你在这里传递userId? JdbcTemplate将自动处理它。

List<User> = (List<User>) jdbcTemplate.query(SELECT_QUERY, new Object[] { userId }, new UserRowMapper());

最后是UserRowMapper类:

class UserRowMapper implements RowMapper {

  @Override
  public Object mapRow(ResultSet resultSet, int row) throws SQLException {
    User user = new User();

    user.setUserId(resultSet.getInt("UserID"));
    user.setUserName(resultSet.getString("User_Name"));
    user.setUserContact(resultSet.getString("User_Contact"));

    return user;
  }
}

这确实是使用JdbcTemplate的最佳和推荐方式。