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
}
}
}
下面是假设 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
}
}
}