Search in sources :

Example 1 with QEntity

use of com.peterphi.std.guice.hibernate.webquery.impl.QEntity in project stdlib by petergeneric.

the class JPAQueryBuilder method getClassesByDiscriminators.

/**
 * Translates the set of string discriminators into entity classes
 *
 * @return
 */
private List<Class<?>> getClassesByDiscriminators(Collection<String> discriminators) {
    Map<String, Class<?>> entitiesByName = new HashMap<>();
    // Prepare a Map of discriminator name -> entity class
    for (QEntity child : entity.getSubEntities()) {
        entitiesByName.put(child.getDiscriminatorValue(), child.getEntityClass());
    }
    // If the root class isn't abstract then add it to the list of possible discriminators too
    if (!entity.isEntityClassAbstract())
        entitiesByName.put(entity.getDiscriminatorValue(), entity.getEntityClass());
    // Translate the discriminator string values to classes
    List<Class<?>> classes = new ArrayList<>(discriminators.size());
    for (String discriminator : discriminators) {
        final Class<?> clazz = entitiesByName.get(discriminator);
        if (clazz != null)
            classes.add(clazz);
        else
            throw new IllegalArgumentException("Invalid class discriminator '" + discriminator + "', expected one of: " + entitiesByName.keySet());
    }
    return classes;
}
Also used : HashMap(java.util.HashMap) ArrayList(java.util.ArrayList) QEntity(com.peterphi.std.guice.hibernate.webquery.impl.QEntity)

Example 2 with QEntity

use of com.peterphi.std.guice.hibernate.webquery.impl.QEntity in project stdlib by petergeneric.

the class JPAQueryBuilder method addFrom.

void addFrom(final String subclasses) {
    if (StringUtils.isEmpty(subclasses)) {
        // No subclass constraints, just a simple FROM call
        this.root = generated.from(entity.getMetamodelEntity());
    } else {
        List<String> discriminators = Arrays.asList(subclasses.split(","));
        final List<Class<?>> classes = getClassesByDiscriminators(discriminators);
        QEntity commonParentClass = entity.getCommonSubclass(discriminators);
        // All the discriminators share a common subclass, so allow the query to reference columns of that subclass
        if (commonParentClass != entity)
            this.entity = commonParentClass;
        this.root = generated.from(entity.getMetamodelEntity());
        // Apply the subclass constraints (if there are multiple constraints)
        if (classes.size() > 1)
            this.conditions.add(root.type().in(classes));
    }
}
Also used : QEntity(com.peterphi.std.guice.hibernate.webquery.impl.QEntity)

Aggregations

QEntity (com.peterphi.std.guice.hibernate.webquery.impl.QEntity)2 ArrayList (java.util.ArrayList)1 HashMap (java.util.HashMap)1