* @return The new QueryStatement
*/
public QueryExpression newQueryStatement(Class candidateClass, DatastoreIdentifier candidateAlias)
{
final DatastoreClass datastoreClass = storeMgr.getDatastoreClass(candidateClass.getName(), clr);
final JavaTypeMapping m = datastoreClass.getIDMapping();
final Class type = candidateClass;
final boolean subclasses = this.subclasses;
QueryExpression stmt = null;
if (!queryUsingDiscriminator(datastoreClass) && !subclasses && hasAggregatedExpressionsOnly())
{
// TODO This is incorrect. Here we want to return a single row so cant use UNION statements
// and our classes are not all in one table so shouldn't use the discriminator. We should have
// a single SELECT like
// SELECT ... FROM BASE
// LEFT OUTER JOIN SUB1 ON ...
// LEFT OUTER JOIN SUB2 ON ...
// WHERE SUB1.ID = NULL AND SUB2.ID = NULL
stmt = new DiscriminatorIteratorStatement(clr,
new Class[] {type}, subclasses, storeMgr, false).getQueryStatement(candidateAlias);
}
else if (queryUsingDiscriminator(datastoreClass) || hasAggregatedExpressionsOnly())
{
// Create a statement using a single SELECT, and using the discriminator to distinguish classes
// Don't select the discriminator column since we don't need it for aggregates
stmt = new DiscriminatorIteratorStatement(clr,
new Class[] {type}, subclasses, storeMgr, false).getQueryStatement(candidateAlias);
}
else
{
// Create a statement using UNIONs between the various possible types and tables
stmt = new UnionIteratorStatement(clr, candidateClass, subclasses, storeMgr,
type, m, datastoreClass, false, Boolean.FALSE, true, false).getQueryStatement(candidateAlias);
}
if (userCandidates != null)
{
/*
* creates a query like WHERE ... AND (CANDIDATE_ID = ?1 OR CANDIDATE_ID =
* ?2) or for classes with composite primary keys WHERE ... AND (
* (CANDIDATE_IDa = ?1a AND CANDIDATE_IDb = ?1b) OR (CANDIDATE_IDa = ?2a
* AND CANDIDATE_IDb = ?2b) )
*/
BooleanExpression elementsExpr = null;
for (Iterator it = userCandidates.iterator(); it.hasNext();)
{
Object candidateValue = it.next();
ScalarExpression expr = m.newScalarExpression(stmt, stmt.getMainTableExpression());
BooleanExpression keyExpr = expr.eq(m.newLiteral(stmt, candidateValue));
if (elementsExpr == null)
{
elementsExpr = keyExpr;
}
else