我之前从未见过这样的问题,谷歌没有帮助。
我使用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 :(得分:2)
您几乎可以通过使用创建SQL的条件检查来获得它,但是您不必为传递给update()方法的变量参数执行此操作。
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());
答案 1 :(得分:0)
你得到的错误是什么???。
check this link jdbcTemplate API中没有包含四个参数的更新方法。您提到了四个参数..
答案 2 :(得分:0)
我不确定我的解决方案是否适合您的问题,但在我的项目中,我使用&#34;插入&#34;看起来像这样的结构:
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);
答案 3 :(得分: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()
);