use of com.manydesigns.elements.text.QueryStringWithParameters in project Portofino by ManyDesigns.
the class ManyToManyAction method loadAssociations.
protected void loadAssociations() throws NoSuchFieldException {
Table table = m2mConfiguration.getActualRelationTable();
TableCriteria criteria = new TableCriteria(table);
// TODO chiave multipla
String onePropertyName = m2mConfiguration.getActualOnePropertyName();
PropertyAccessor onePropertyAccessor = relationTableAccessor.getProperty(onePropertyName);
// TODO chiave multipla
SelectionProviderReference manySelectionProvider = m2mConfiguration.getManySelectionProvider();
String manyPropertyName = manySelectionProvider.getActualSelectionProvider().getReferences().get(0).getActualFromColumn().getActualPropertyName();
PropertyAccessor manyPropertyAccessor = relationTableAccessor.getProperty(manyPropertyName);
criteria = criteria.eq(onePropertyAccessor, onePk);
QueryStringWithParameters queryString;
try {
queryString = QueryUtils.mergeQuery(m2mConfiguration.getQuery(), criteria, this);
} catch (RuntimeException e) {
RequestMessages.addErrorMessage("Invalid query");
throw e;
}
existingAssociations = QueryUtils.runHqlQuery(session, queryString.getQueryString(), queryString.getParameters());
availableAssociations = new ArrayList<Object>();
String databaseName = ((DatabaseSelectionProvider) manySelectionProvider.getActualSelectionProvider()).getToDatabase();
String hql = ((DatabaseSelectionProvider) manySelectionProvider.getActualSelectionProvider()).getHql();
if (!StringUtils.isEmpty(hql)) {
Session selectionProviderSession = persistence.getSession(databaseName);
QueryStringWithParameters manyQuery = QueryUtils.mergeQuery(hql, null, this);
potentiallyAvailableAssociations = QueryUtils.runHqlQuery(selectionProviderSession, manyQuery.getQueryString(), manyQuery.getParameters());
} else {
throw new RuntimeException("Couldn't determine many query");
}
PropertyAccessor[] manyKeyProperties = manyTableAccessor.getKeyProperties();
// TODO handle manyKeyProperties.length > 1
PropertyAccessor manyPkAccessor = manyTableAccessor.getProperty(manyKeyProperties[0].getName());
for (Object o : potentiallyAvailableAssociations) {
Object oPk = manyPkAccessor.get(o);
boolean existing = isExistingAssociation(manyPropertyAccessor, oPk);
if (!existing) {
availableAssociations.add(o);
}
}
}
use of com.manydesigns.elements.text.QueryStringWithParameters in project Portofino by ManyDesigns.
the class QueryUtils method getQueryStringWithParametersForCriteria.
/**
* Tranforms a {@link TableCriteria} to a query string with an associated array of parameters.
* @param criteria the criteria.
* @param alias the alias to use for the main entity.
* @return the same criteria encoded as a HQL query with parameters.
*/
public static QueryStringWithParameters getQueryStringWithParametersForCriteria(@Nullable TableCriteria criteria, @Nullable String alias, int initialParameterIndex) {
if (criteria == null) {
return new QueryStringWithParameters("", new Object[0]);
}
Table table = criteria.getTable();
ArrayList<Object> parametersList = new ArrayList<Object>();
StringBuilder whereBuilder = new StringBuilder();
for (Criterion criterion : criteria) {
PropertyAccessor accessor = criterion.getPropertyAccessor();
String hqlFormat;
if (criterion instanceof TableCriteria.EqCriterion) {
TableCriteria.EqCriterion eqCriterion = (TableCriteria.EqCriterion) criterion;
Object value = eqCriterion.getValue();
hqlFormat = "{0} = :p" + (parametersList.size() + initialParameterIndex);
parametersList.add(value);
} else if (criterion instanceof TableCriteria.InCriterion) {
TableCriteria.InCriterion inCriterion = (TableCriteria.InCriterion) criterion;
Object[] values = inCriterion.getValues();
StringBuilder params = new StringBuilder();
if (values != null) {
boolean first = true;
for (Object value : values) {
if (!first) {
params.append(", :p").append(parametersList.size() + initialParameterIndex);
} else {
params.append(":p").append(parametersList.size() + initialParameterIndex);
first = false;
}
parametersList.add(value);
}
hqlFormat = "{0} in (" + params + ")";
} else {
hqlFormat = null;
}
} else if (criterion instanceof TableCriteria.NeCriterion) {
TableCriteria.NeCriterion neCriterion = (TableCriteria.NeCriterion) criterion;
Object value = neCriterion.getValue();
hqlFormat = "{0} <> :p" + (parametersList.size() + initialParameterIndex);
parametersList.add(value);
} else if (criterion instanceof TableCriteria.BetweenCriterion) {
TableCriteria.BetweenCriterion betweenCriterion = (TableCriteria.BetweenCriterion) criterion;
Object min = betweenCriterion.getMin();
Object max = betweenCriterion.getMax();
hqlFormat = "{0} >= :p" + (parametersList.size() + initialParameterIndex) + " AND {0} <= :p" + (parametersList.size() + initialParameterIndex + 1);
parametersList.add(min);
parametersList.add(max);
} else if (criterion instanceof TableCriteria.GtCriterion) {
TableCriteria.GtCriterion gtCriterion = (TableCriteria.GtCriterion) criterion;
Object value = gtCriterion.getValue();
hqlFormat = "{0} > :p" + (parametersList.size() + initialParameterIndex);
parametersList.add(value);
} else if (criterion instanceof TableCriteria.GeCriterion) {
TableCriteria.GeCriterion gtCriterion = (TableCriteria.GeCriterion) criterion;
Object value = gtCriterion.getValue();
hqlFormat = "{0} >= :p" + (parametersList.size() + initialParameterIndex);
parametersList.add(value);
} else if (criterion instanceof TableCriteria.LtCriterion) {
TableCriteria.LtCriterion ltCriterion = (TableCriteria.LtCriterion) criterion;
Object value = ltCriterion.getValue();
hqlFormat = "{0} < :p" + (parametersList.size() + initialParameterIndex);
parametersList.add(value);
} else if (criterion instanceof TableCriteria.LeCriterion) {
TableCriteria.LeCriterion leCriterion = (TableCriteria.LeCriterion) criterion;
Object value = leCriterion.getValue();
hqlFormat = "{0} <= :p" + (parametersList.size() + initialParameterIndex);
parametersList.add(value);
} else if (criterion instanceof TableCriteria.LikeCriterion) {
TableCriteria.LikeCriterion likeCriterion = (TableCriteria.LikeCriterion) criterion;
String value = (String) likeCriterion.getValue();
if (likeCriterion.getTextMatchMode() == TextMatchMode.EQUALS) {
hqlFormat = "{0} = :p" + (parametersList.size() + initialParameterIndex);
parametersList.add(value);
} else {
String pattern = processTextMatchMode(likeCriterion.getTextMatchMode(), value);
hqlFormat = "{0} like :p" + (parametersList.size() + initialParameterIndex);
parametersList.add(pattern);
}
} else if (criterion instanceof TableCriteria.IlikeCriterion) {
TableCriteria.IlikeCriterion ilikeCriterion = (TableCriteria.IlikeCriterion) criterion;
String value = (String) ilikeCriterion.getValue();
if (ilikeCriterion.getTextMatchMode() == TextMatchMode.EQUALS) {
hqlFormat = "lower({0}) = lower(:p" + (parametersList.size() + initialParameterIndex + ")");
parametersList.add(value);
} else {
String pattern = processTextMatchMode(ilikeCriterion.getTextMatchMode(), value);
hqlFormat = "lower({0}) like lower(:p" + (parametersList.size() + initialParameterIndex) + ")";
parametersList.add(pattern);
}
} else if (criterion instanceof TableCriteria.IsNullCriterion) {
hqlFormat = "{0} is null";
} else if (criterion instanceof TableCriteria.IsNotNullCriterion) {
hqlFormat = "{0} is not null";
} else {
logger.error("Unrecognized criterion: {}", criterion);
throw new InternalError("Unrecognied criterion");
}
if (hqlFormat == null) {
continue;
}
String accessorName = accessor.getName();
if (alias != null) {
accessorName = alias + "." + accessorName;
}
String hql = MessageFormat.format(hqlFormat, accessorName);
if (whereBuilder.length() > 0) {
whereBuilder.append(" AND ");
}
whereBuilder.append(hql);
}
String whereClause = whereBuilder.toString();
String queryString;
String actualEntityName = table.getActualEntityName();
if (alias != null) {
actualEntityName += " " + alias;
}
if (whereClause.length() > 0) {
queryString = MessageFormat.format("FROM {0}" + WHERE_STRING + "{1}", actualEntityName, whereClause);
} else {
queryString = MessageFormat.format("FROM {0}", actualEntityName);
}
Object[] parameters = new Object[parametersList.size()];
parametersList.toArray(parameters);
return new QueryStringWithParameters(queryString, parameters);
}
Aggregations