Search in sources :

Example 1 with SingularAttributePath

use of org.hibernate.ejb.criteria.path.SingularAttributePath in project BroadleafCommerce by BroadleafCommerce.

the class FieldPathBuilder method getPath.

@SuppressWarnings({ "rawtypes", "unchecked", "serial" })
public Path getPath(From root, FieldPath fieldPath, final CriteriaBuilder builder) {
    FieldPath myFieldPath = fieldPath;
    if (!StringUtils.isEmpty(fieldPath.getTargetProperty())) {
        myFieldPath = getFieldPath(root, fieldPath.getTargetProperty());
    }
    From myRoot = root;
    for (String pathElement : myFieldPath.getAssociationPath()) {
        myRoot = myRoot.join(pathElement);
    }
    Path path = myRoot;
    for (int i = 0; i < myFieldPath.getTargetPropertyPieces().size(); i++) {
        String piece = myFieldPath.getTargetPropertyPieces().get(i);
        if (path.getJavaType().isAnnotationPresent(Embeddable.class)) {
            String original = ((SingularAttributePath) path).getAttribute().getDeclaringType().getJavaType().getName() + "." + ((SingularAttributePath) path).getAttribute().getName() + "." + piece;
            String copy = path.getJavaType().getName() + "." + piece;
            copyCollectionPersister(original, copy, ((CriteriaBuilderImpl) builder).getEntityManagerFactory().getSessionFactory());
        }
        try {
            path = path.get(piece);
        } catch (IllegalArgumentException e) {
            // We weren't able to resolve the requested piece, likely because it's in a polymoprhic version
            // of the path we're currently on. Let's see if there's any polymoprhic version of our class to
            // use instead.
            EntityManagerFactoryImpl em = ((CriteriaBuilderImpl) builder).getEntityManagerFactory();
            Metamodel mm = em.getMetamodel();
            boolean found = false;
            Class<?>[] polyClasses = dynamicDaoHelper.getAllPolymorphicEntitiesFromCeiling(path.getJavaType(), em.getSessionFactory(), true, true);
            for (Class<?> clazz : polyClasses) {
                ManagedType mt = mm.managedType(clazz);
                try {
                    Attribute attr = mt.getAttribute(piece);
                    if (attr != null) {
                        Root additionalRoot = criteria.from(clazz);
                        restrictions.add(builder.equal(path, additionalRoot));
                        path = additionalRoot.get(piece);
                        found = true;
                        break;
                    }
                } catch (IllegalArgumentException e2) {
                // Do nothing - we'll try the next class and see if it has the attribute
                }
            }
            if (!found) {
                throw new IllegalArgumentException("Could not resolve requested attribute against path, including" + " known polymorphic versions of the root", e);
            }
        }
        if (path.getParentPath() != null && path.getParentPath().getJavaType().isAnnotationPresent(Embeddable.class) && path instanceof PluralAttributePath) {
            // We'll throw a specialized exception (and handle in an alternate flow for calls from BasicPersistenceModule)
            throw new CriteriaConversionException(String.format("Unable to create a JPA criteria Path through an @Embeddable object to a collection that resides therein (%s)", fieldPath.getTargetProperty()), fieldPath);
        // //TODO this code should work, but there still appear to be bugs in Hibernate's JPA criteria handling for lists
        // //inside Embeddables
        // Class<?> myClass = ((PluralAttributePath) path).getAttribute().getClass().getInterfaces()[0];
        // //we don't know which version of "join" to call, so we'll let reflection figure it out
        // try {
        // From embeddedJoin = myRoot.join(((SingularAttributePath) path.getParentPath()).getAttribute());
        // Method join = embeddedJoin.getClass().getMethod("join", myClass);
        // path = (Path) join.invoke(embeddedJoin, ((PluralAttributePath) path).getAttribute());
        // } catch (Exception e) {
        // throw new RuntimeException(e);
        // }
        }
    }
    return path;
}
Also used : PluralAttributePath(org.hibernate.ejb.criteria.path.PluralAttributePath) SingularAttributePath(org.hibernate.ejb.criteria.path.SingularAttributePath) Path(javax.persistence.criteria.Path) CriteriaBuilderImpl(org.hibernate.ejb.criteria.CriteriaBuilderImpl) ManagedType(javax.persistence.metamodel.ManagedType) Root(javax.persistence.criteria.Root) Attribute(javax.persistence.metamodel.Attribute) EntityManagerFactoryImpl(org.hibernate.ejb.EntityManagerFactoryImpl) From(javax.persistence.criteria.From) PluralAttributePath(org.hibernate.ejb.criteria.path.PluralAttributePath) SingularAttributePath(org.hibernate.ejb.criteria.path.SingularAttributePath) Metamodel(javax.persistence.metamodel.Metamodel)

Aggregations

From (javax.persistence.criteria.From)1 Path (javax.persistence.criteria.Path)1 Root (javax.persistence.criteria.Root)1 Attribute (javax.persistence.metamodel.Attribute)1 ManagedType (javax.persistence.metamodel.ManagedType)1 Metamodel (javax.persistence.metamodel.Metamodel)1 EntityManagerFactoryImpl (org.hibernate.ejb.EntityManagerFactoryImpl)1 CriteriaBuilderImpl (org.hibernate.ejb.criteria.CriteriaBuilderImpl)1 PluralAttributePath (org.hibernate.ejb.criteria.path.PluralAttributePath)1 SingularAttributePath (org.hibernate.ejb.criteria.path.SingularAttributePath)1