package gcom.persistence.util; import java.util.HashMap; import java.util.Map; import java.util.Set; import org.hibernate.Query; import org.hibernate.Session; public class QueryUpdateBuilder { private Session session; private StringBuffer sqlStatement; private StringBuffer sqlConditions; private Query query; private Map<String, Object> parameters; public QueryUpdateBuilder(Session session, Class<?> klass){ this.session = session; parameters = new HashMap<String, Object>(); sqlStatement = new StringBuffer(); sqlConditions = new StringBuffer(); sqlStatement.append("UPDATE "); sqlStatement.append(klass.getSimpleName()); sqlStatement.append(" SET"); } public StringBuffer appendIfNotNull(String field, Object value) { if (value != null) { sqlStatement.append(" "); sqlStatement.append(field); sqlStatement.append(" = "); sqlStatement.append(":"); sqlStatement.append(field); sqlStatement.append(","); parameters.put(field, value); } return sqlStatement; } public StringBuffer appendCondition(String condition, String operator, Object value) { if (sqlConditions.toString().isEmpty()) { sqlConditions.append(" WHERE"); } sqlConditions.append(" "); sqlConditions.append(condition); sqlConditions.append(" "); sqlConditions.append(operator); sqlConditions.append(" :"); sqlConditions.append(condition); parameters.put(condition, value); return sqlConditions; } public StringBuffer appendAndCondition(String condition, String operator, Object value) { sqlConditions.append(" AND"); return appendCondition(condition, operator, value); } public StringBuffer appendOrCondition(String condition, String operator, Object value) { sqlConditions.append(" OR"); return appendCondition(condition, operator, value); } public Query createUpdateQuery() { query = (Query) session.createQuery(sql()); Set<String> idsValue = parameters.keySet(); for (String idValue : idsValue) { setParameterIfNotNull(idValue, parameters.get(idValue)); } return query; } public StringBuffer getSqlStatement() { return sqlStatement; } public void setSqlStatement(StringBuffer sqlStatement) { this.sqlStatement = sqlStatement; } public StringBuffer getSqlConditions() { return sqlConditions; } public void setSqlConditions(StringBuffer sqlConditions) { this.sqlConditions = sqlConditions; } public Query getQuery() { return query; } public void setQuery(Query query) { this.query = query; } public Map<String, Object> getParameters() { return parameters; } public void setParameters(Map<String, Object> parameters) { this.parameters = parameters; } public String sql() { return sqlStatement.substring(0, sqlStatement.length() - 1).concat(sqlConditions.toString()); } private Query setParameterIfNotNull(String name, Object value) { if (value != null){ query.setParameter(name, value); } return query; } }