Spring jdbcTemplate:运行 提供模型名称的 select 查询的通用代码

Spring jdbcTemplate: generic code to run a select query with model name provided

下面是假设 MyModel class 是模型 class 的工作代码。

void runSql(String sql) {

    List<MyModel> models = JdbcTemplate.query(sql, params, new BeanPropertyRowMapper(MyModel.class));

    for (MyModel model : models) {

    ...
    }
}

如何编写上述方法的通用版本,将 "MyModel" 等模型名称作为字符串。

我能想到的最好的是下面的代码。但是,它抛出 ClassCastException: java.lang.String cannot be cast to MyModel.

void runSql(String sql, String modelName) {

    Class modelClass = modelName.getClass();

// how to replace List<MyModel> with something like List<modelClass.getName()>
    List<MyModel> models = JdbcTemplate.query(sql, params, new BeanPropertyRowMapper(modelClass));

    for (MyModel model : models) { // exception here: ClassCastException: java.lang.String cannot be cast to MyModel

    ...
    }
}

好吧,这取决于您将如何处理结果对象。你可以选择这样的东西:

void runSql(String sql, String modelName) {

    Class modelClass = Class.forName("com.mycompany.model." + modelName);

    List<?> models = JdbcTemplate.queryForList(sql, modelClass, params);

    for (Object model : models) { 
        //Then you should cast your model manually if you need to
        if (model instanceof MyModel) {
            MyModel myModel = (MyModel) model;
            //do whatever with object of MyModel class
        }
    }
}