2016-08-10 2 views
1

Я никогда раньше не встречал такой проблемы, google не помогает.Spring getJdbcTemplate(). Update insert dynamic object

Я использую Spring Framework, JdbcDaoSupport, getJdbcTemplate().update() способ. У меня динамический запрос с 2 необязательными параметрами.

Не знаю, как правильно вводить динамический объект. это, как я попробовать:

StringBuilder sbUserRegQuery = new StringBuilder(); 
    sbUserRegQuery.append("INSERT INTO users (username, password , email, enabled, datetime_condo_changed, datetime_last_login"); 
    if(user.getCondo_id()!=null) sbUserRegQuery.append(", condo_id"); 
    if(user.getProvider()!=null) sbUserRegQuery.append(", provider"); 
    sbUserRegQuery.append(")"); 
    sbUserRegQuery.append(" VALUES (?, ?, ? , ? , ?, ?"); 
    if(user.getCondo_id()!=null) sbUserRegQuery.append(", ?"); 
    if(user.getProvider()!=null) sbUserRegQuery.append(", ?"); //default - "local" 
    sbUserRegQuery.append(");"); 

     Object regObject = new Object[]{ 
      user.getUsername(), PasswordEncoderGenerator.main(user.getPassword()), user.getEmail(), enabled, user.getDatetime_condo_changed(), currentTimeStamp, user.getCondo_id() 
     }; 

     int row = getJdbcTemplate().update(sbUserRegQuery.toString(), regObject, user.getCondo_id(), user.getProvider()); 

то, что я пытаюсь вставить динамический объект после regObject. Но в этом случае порядок динамического объекта может быть изменен, а запрос не выполнен.

Как решить этот случай?

+0

См http://stackoverflow.com/questions/35169818/make-dynamic-query-with-jdbctemplate – Pau

ответ

2

вы почти у его с помощью условных проверок на создание SQL, но вы тогда не делать, что для переменных аргументов, передаваемых в метод обновления().

http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/jdbc/core/JdbcTemplate.html#update-java.lang.String-java.lang.Object...-

StringBuilder sbUserRegQuery = new StringBuilder(); 
sbUserRegQuery.append("INSERT INTO users (username, password , email, enabled, datetime_condo_changed, datetime_last_login"); 
if(user.getCondo_id()!=null) sbUserRegQuery.append(", condo_id"); 
if(user.getProvider()!=null) sbUserRegQuery.append(", provider"); 
sbUserRegQuery.append(")"); 
sbUserRegQuery.append(" VALUES (?, ?, ? , ? , ?, ?"); 
if(user.getCondo_id()!=null) sbUserRegQuery.append(", ?"); 
if(user.getProvider()!=null) sbUserRegQuery.append(", ?"); 
sbUserRegQuery.append(");"); 

ArrayList<Object> params = new ArrayList<Object>(); 
params.add(user.getUsername()); 
params.add(PasswordEncoderGenerator.main(user.getPassword())); 
params.add(user.getEmail()); 
params.add(enabled); 
params.add(user.getDatetime_condo_changed()); 
params.add(currentTimeStamp); 
if(user.getCondo_id()!=null) params.add(user.getCondo_id()); 
if(user.getProvider()!=null) params.add(user.getProvider()); 

int row = getJdbcTemplate().update(sbUserRegQuery.toString(), params.toArray()); 
+0

получил это, спасибо! – user1935987

0

Какая ошибка вы получаете ???.

check this link Там нет способа обновления с четырьмя параметров в JdbcTemplate API.You упоминает четыре параметра ..

+0

недопустимые значения, причина позиции «condo_id» и «провайдер» динамичны – user1935987

0

Я не уверен, если мое решение будет подходить для вашей проблемы, но в моих проектах я использую «вставка» конструкция, которая выглядит следующим образом:

public void insert(User u) { 
    final String sql = "insert into user(firstName, lastName, email, password) values(?,?,?,?)"; 

    final String firstName = u.getFirstName(); 
    final String lastName = u.getLastName(); 
    final String email = u.getEmail(); 
    final String password = u.getPassword(); 

    jdbcTemplate.update(new PreparedStatementCreator() { 
     public PreparedStatement createPreparedStatement(
       Connection connection) throws SQLException { 
      PreparedStatement ps = connection.prepareStatement(sql, 
        new String[] { "id" }); 
      ps.setString(1, firstName); 
      ps.setString(2, lastName); 
      ps.setString(3, email); 
      ps.setString(4, password); 
      return ps; 
     } 
    }, idHolder); 
0

Какую ошибку вы получите в консоли? Вам лучше вставить его сюда.
Я предлагаю вам изменить:

Object regObject = new Object[]{ 
     user.getUsername(), PasswordEncoderGenerator.main(user.getPassword()), user.getEmail(), enabled, user.getDatetime_condo_changed(), currentTimeStamp, user.getCondo_id() 
    }; 


    int row = getJdbcTemplate().update(sbUserRegQuery.toString(), regObject, user.getCondo_id(), user.getProvider()); 

к:

int row = getJdbcTemplate().update(
        sbUserRegQuery, 
        user.getUsername(), 
        user.getPassword(), 
        user.getEmail(), 
        enabled, 
        user.getDatetime_condo_changed(), 
        currentTimeStamp, 
        user.getCondo_id(), 
        user.getCondo_id(), 
        user.getProvider() 
);