package org.hibernate.envers.tools.query; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.envers.tools.MutableInteger; import org.hibernate.envers.tools.Pair; import org.hibernate.envers.tools.StringTools; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * @author Lukasz Antoniak (lukasz dot antoniak at gmail dot com) */ public class UpdateBuilder { private final String entityName; private final String alias; private final MutableInteger paramCounter; private final Parameters rootParameters; private final Map<String, Object> updates; public UpdateBuilder(String entityName, String alias) { this(entityName, alias, new MutableInteger()); } private UpdateBuilder(String entityName, String alias, MutableInteger paramCounter) { this.entityName = entityName; this.alias = alias; this.paramCounter = paramCounter; rootParameters = new Parameters(alias, "and", paramCounter); updates = new HashMap<String, Object>(); } public Parameters getRootParameters() { return rootParameters; } public void updateValue(String propertyName, Object value) { updates.put(propertyName, value); } public void build(StringBuilder sb, Map<String, Object> updateParamValues) { sb.append("update ").append(entityName).append(" ").append(alias); sb.append(" set "); int i = 1; for (String property : updates.keySet()) { final String paramName = generateParameterName(); sb.append(alias).append(".").append(property).append(" = ").append(":").append(paramName); updateParamValues.put(paramName, updates.get(property)); if (i < updates.size()) { sb.append(", "); } ++i; } if (!rootParameters.isEmpty()) { sb.append(" where "); rootParameters.build(sb, updateParamValues); } } private String generateParameterName() { return "_u" + paramCounter.getAndIncrease(); } public Query toQuery(Session session) { StringBuilder querySb = new StringBuilder(); Map<String, Object> queryParamValues = new HashMap<String, Object>(); build(querySb, queryParamValues); Query query = session.createQuery(querySb.toString()); for (Map.Entry<String, Object> paramValue : queryParamValues.entrySet()) { query.setParameter(paramValue.getKey(), paramValue.getValue()); } return query; } }