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;
}
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));
}
}