use of org.broadleafcommerce.openadmin.server.service.persistence.module.criteria.CriteriaConversionException in project BroadleafCommerce by BroadleafCommerce.
the class BasicPersistenceModule method getSpecialCaseQueryBuilder.
/**
* Use an alternate approach to generating a fetch query for a collection located inside of an @Embeddable object. Related
* to https://hibernate.atlassian.net/browse/HHH-8802. The alternate approach leverages HQL rather than JPA criteria,
* which seems to alleviate the problem.
*
* @param embeddedCollectionPath the path to the collection field itself
* @param filterMappings all the fetch restrictions for this request
* @param collectionClass the type of the collection members
* @return the builder capable of generating an appropriate HQL query
*/
protected TypedQueryBuilder getSpecialCaseQueryBuilder(FieldPath embeddedCollectionPath, List<FilterMapping> filterMappings, String collectionClass) {
String specialPath = embeddedCollectionPath.getTargetProperty();
String[] pieces = specialPath.split("\\.");
if (pieces.length != 3) {
throw new CriteriaConversionException(String.format("Expected to find a target property of format [embedded field].[collection field].[property] for the embedded collection path (%s)", specialPath), embeddedCollectionPath);
}
String expression = specialPath.substring(0, specialPath.lastIndexOf("."));
TypedQueryBuilder builder;
try {
builder = new TypedQueryBuilder(Class.forName(collectionClass), "specialEntity").addJoin(new TQJoin("specialEntity." + expression, "embeddedCollection"));
} catch (Exception e) {
throw ExceptionHelper.refineException(e);
}
for (TQRestriction restriction : buildSpecialRestrictions(expression, filterMappings)) {
builder = builder.addRestriction(restriction);
}
for (TQRestriction restriction : buildStandardRestrictions(embeddedCollectionPath, filterMappings)) {
builder = builder.addRestriction(restriction);
}
for (FilterMapping mapping : filterMappings) {
if (mapping.getSortDirection() != null) {
String mappingProperty = mapping.getFieldPath() == null ? null : mapping.getFieldPath().getTargetProperty();
if (StringUtils.isEmpty(mappingProperty)) {
mappingProperty = mapping.getFullPropertyName();
}
builder = builder.addOrder(new TQOrder("specialEntity." + mappingProperty, SortDirection.ASCENDING == mapping.getSortDirection()));
}
}
return builder;
}
Aggregations