Как вы отображаете результат выполнения хранимой процедуры Spring?

Вот что мы придумали для копирования одного поля в другое для ~ 150_000 записей. Это заняло около 6 минут, но все еще значительно менее ресурсоемким, чем это было бы для создания экземпляра и повторения одного и того же количества объектов ruby.

js_query = %({
  $or : [
    {
      'settings.mobile_notifications' : { $exists : false },
      'settings.mobile_admin_notifications' : { $exists : false }
    }
  ]
})

js_for_each = %(function(user) {
  if (!user.settings.hasOwnProperty('mobile_notifications')) {
    user.settings.mobile_notifications = user.settings.email_notifications;
  }
  if (!user.settings.hasOwnProperty('mobile_admin_notifications')) {
    user.settings.mobile_admin_notifications = user.settings.email_admin_notifications;
  }
  db.users.save(user);
})

js = "db.users.find(#{js_query}).forEach(#{js_for_each});"
Mongoid::Sessions.default.command('$eval' => js)
1
задан user3073772 16 January 2019 в 06:11
поделиться

2 ответа

Пример из Spring Docs с использованием RowMapper:

public class JdbcActorDao implements ActorDao {

private SimpleJdbcCall procReadAllActors;

public void setDataSource(DataSource dataSource) {
    JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
    jdbcTemplate.setResultsMapCaseInsensitive(true);
    this.procReadAllActors = new SimpleJdbcCall(jdbcTemplate)
            .withProcedureName("read_all_actors")
            .returningResultSet("actors",
            BeanPropertyRowMapper.newInstance(Actor.class));
}

public List getActorsList() {
    Map m = procReadAllActors.execute(new HashMap<String, Object>(0));
    return (List) m.get("actors");
}

// ... additional methods

}

0
ответ дан Artur Vakhrameev 16 January 2019 в 06:11
поделиться

потребовалось некоторое время, чтобы истолковать документы Spring, но я наконец-то туда попал. Мое решение:

    SimpleJdbcCall simpleJdbcCall = new SimpleJdbcCall(jdbcTemplate)
                                                      .withProcedureName("DistinctRunNames")
                     .withoutProcedureColumnMetaDataAccess();
    simpleJdbcCall.addDeclaredParameter(new SqlParameter("environment", Types.VARCHAR));
    simpleJdbcCall.addDeclaredParameter(new SqlParameter("username", Types.VARCHAR));
    simpleJdbcCall.addDeclaredParameter(new SqlParameter("test_suite", Types.VARCHAR));
   SqlParameterSource parameters = new MapSqlParameterSource().addValue("environment", environment)
                                                    .addValue("username", username).addValue("test_suite", testSuite);
    Map map = simpleJdbcCall.returningResultSet("runnames", new ParameterizedRowMapper<RunNameBean>() {
           public RunNameBean mapRow(ResultSet rs, int rowNum) throws SQLException {
                  RunNameBean runNameBean = new RunNameBean();
       runNameBean.setName(rs.getString("runname"));
       return runNameBean;
       }
          }).execute(parameters);
    return (List) map.get("runnames");

Были проблемы с ожидаемыми параметрами по сравнению с фактическими, пришлось разбить объект simpleJdbcCall. Карты результаты в список красиво. Спасибо за ответы, помог мне узнать о Spring mapping.

0
ответ дан user3073772 16 January 2019 в 06:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: