CriteriaTools.checkPropertyNotARelation( auditCfg, entityName, propertyName );
// Make sure our conditions are ANDed together even if the parent Parameters have a different connective
Parameters subParams = parameters.addSubParameters( Parameters.AND );
// This will be the aggregated query, containing all the specified conditions
QueryBuilder subQb = qb.newSubQueryBuilder();
// Adding all specified conditions both to the main query, as well as to the
// aggregated one.
for ( AuditCriterion versionsCriteria : criterions ) {
versionsCriteria.addToQuery( auditCfg, versionsReader, entityName, qb, subParams );
versionsCriteria.addToQuery( auditCfg, versionsReader, entityName, subQb, subQb.getRootParameters() );
}
// Setting the desired projection of the aggregated query
switch ( mode ) {
case MIN:
subQb.addProjection( "min", propertyName, false );
break;
case MAX:
subQb.addProjection( "max", propertyName, false );
}
// Correlating subquery with the outer query by entity id. See JIRA HHH-7827.
if ( correlate ) {
final String originalIdPropertyName = auditCfg.getAuditEntCfg().getOriginalIdPropName();
auditCfg.getEntCfg().get( entityName ).getIdMapper().addIdsEqualToQuery(
subQb.getRootParameters(),
subQb.getRootAlias() + "." + originalIdPropertyName,
qb.getRootAlias() + "." + originalIdPropertyName
);
}
// Adding the constrain on the result of the aggregated criteria