Search in sources :

Example 1 with TypedQueryBuilder

use of org.broadleafcommerce.common.util.dao.TypedQueryBuilder 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;
}
Also used : CriteriaConversionException(org.broadleafcommerce.openadmin.server.service.persistence.module.criteria.CriteriaConversionException) TQOrder(org.broadleafcommerce.common.util.dao.TQOrder) TypedQueryBuilder(org.broadleafcommerce.common.util.dao.TypedQueryBuilder) TQJoin(org.broadleafcommerce.common.util.dao.TQJoin) FilterMapping(org.broadleafcommerce.openadmin.server.service.persistence.module.criteria.FilterMapping) ServiceException(org.broadleafcommerce.common.exception.ServiceException) InvocationTargetException(java.lang.reflect.InvocationTargetException) PersistenceException(org.broadleafcommerce.openadmin.server.service.persistence.PersistenceException) CriteriaConversionException(org.broadleafcommerce.openadmin.server.service.persistence.module.criteria.CriteriaConversionException) BeansException(org.springframework.beans.BeansException) ValidationException(org.broadleafcommerce.openadmin.server.service.ValidationException) ParentEntityPersistenceException(org.broadleafcommerce.openadmin.server.service.persistence.ParentEntityPersistenceException) SecurityServiceException(org.broadleafcommerce.common.exception.SecurityServiceException) TQRestriction(org.broadleafcommerce.common.util.dao.TQRestriction)

Example 2 with TypedQueryBuilder

use of org.broadleafcommerce.common.util.dao.TypedQueryBuilder in project BroadleafCommerce by BroadleafCommerce.

the class TypedQueryBuilderTest method testOneNested.

public void testOneNested() {
    TypedQueryBuilder<String> q = new TypedQueryBuilder<>(String.class, "test");
    TQRestriction r = new TQRestriction(TQRestriction.Mode.AND).addChildRestriction(new TQRestriction("test.startDate", "&lt;", "123")).addChildRestriction(new TQRestriction(TQRestriction.Mode.OR).addChildRestriction(new TQRestriction("test.endDate", "is null")).addChildRestriction(new TQRestriction("test.endDate", "&gt;", "456")));
    q.addRestriction("test.attr", "=", "sample");
    q.addRestriction(r);
    StringBuilder expected = new StringBuilder("SELECT test FROM " + String.class.getName() + " test").append(" WHERE (test.attr = :p0)").append(" AND ((test.startDate &lt; :p1_0) AND ((test.endDate is null) OR (test.endDate &gt; :p1_1_1)))");
    assertEquals(q.toQueryString(), expected.toString());
    assertEquals(q.getParamMap().get("p0"), "sample");
    assertEquals(q.getParamMap().get("p1_0"), "123");
    assertEquals(q.getParamMap().get("p1_1"), null);
    assertEquals(q.getParamMap().get("p1_1_0"), null);
    assertEquals(q.getParamMap().get("p1_1_1"), "456");
    assertEquals(q.getParamMap().size(), 5);
}
Also used : TypedQueryBuilder(org.broadleafcommerce.common.util.dao.TypedQueryBuilder) TQRestriction(org.broadleafcommerce.common.util.dao.TQRestriction)

Example 3 with TypedQueryBuilder

use of org.broadleafcommerce.common.util.dao.TypedQueryBuilder in project BroadleafCommerce by BroadleafCommerce.

the class TypedQueryBuilderTest method testTwoNested.

public void testTwoNested() {
    TypedQueryBuilder<String> q = new TypedQueryBuilder<>(String.class, "test");
    TQRestriction r = new TQRestriction(TQRestriction.Mode.AND).addChildRestriction(new TQRestriction("test.startDate", "&lt;", "123")).addChildRestriction(new TQRestriction(TQRestriction.Mode.OR).addChildRestriction(new TQRestriction("test.endDate", "is null")).addChildRestriction(new TQRestriction("test.endDate", "&gt;", "456")));
    TQRestriction r2 = new TQRestriction(TQRestriction.Mode.OR).addChildRestriction(new TQRestriction("test.res1", "=", "333")).addChildRestriction(new TQRestriction(TQRestriction.Mode.AND).addChildRestriction(new TQRestriction("test.res2", "is null")).addChildRestriction(new TQRestriction("test.res3", "&gt;", "456")));
    q.addRestriction("test.attr", "=", "sample");
    q.addRestriction(r);
    q.addRestriction(r2);
    System.out.println(q.toQueryString());
    StringBuilder expected = new StringBuilder("SELECT test FROM " + String.class.getName() + " test").append(" WHERE (test.attr = :p0)").append(" AND ((test.startDate &lt; :p1_0) AND ((test.endDate is null) OR (test.endDate &gt; :p1_1_1)))").append(" AND ((test.res1 = :p2_0) OR ((test.res2 is null) AND (test.res3 &gt; :p2_1_1)))");
    assertEquals(q.toQueryString(), expected.toString());
    assertEquals(q.getParamMap().get("p0"), "sample");
    assertEquals(q.getParamMap().get("p1_0"), "123");
    assertEquals(q.getParamMap().get("p1_1"), null);
    assertEquals(q.getParamMap().get("p1_1_0"), null);
    assertEquals(q.getParamMap().get("p1_1_1"), "456");
    assertEquals(q.getParamMap().get("p2_0"), "333");
    assertEquals(q.getParamMap().get("p2_1"), null);
    assertEquals(q.getParamMap().get("p2_1_0"), null);
    assertEquals(q.getParamMap().get("p2_1_1"), "456");
    assertEquals(q.getParamMap().size(), 9);
}
Also used : TypedQueryBuilder(org.broadleafcommerce.common.util.dao.TypedQueryBuilder) TQRestriction(org.broadleafcommerce.common.util.dao.TQRestriction)

Aggregations

TQRestriction (org.broadleafcommerce.common.util.dao.TQRestriction)3 TypedQueryBuilder (org.broadleafcommerce.common.util.dao.TypedQueryBuilder)3 InvocationTargetException (java.lang.reflect.InvocationTargetException)1 SecurityServiceException (org.broadleafcommerce.common.exception.SecurityServiceException)1 ServiceException (org.broadleafcommerce.common.exception.ServiceException)1 TQJoin (org.broadleafcommerce.common.util.dao.TQJoin)1 TQOrder (org.broadleafcommerce.common.util.dao.TQOrder)1 ValidationException (org.broadleafcommerce.openadmin.server.service.ValidationException)1 ParentEntityPersistenceException (org.broadleafcommerce.openadmin.server.service.persistence.ParentEntityPersistenceException)1 PersistenceException (org.broadleafcommerce.openadmin.server.service.persistence.PersistenceException)1 CriteriaConversionException (org.broadleafcommerce.openadmin.server.service.persistence.module.criteria.CriteriaConversionException)1 FilterMapping (org.broadleafcommerce.openadmin.server.service.persistence.module.criteria.FilterMapping)1 BeansException (org.springframework.beans.BeansException)1