OPENJPA-1013: Constructor support in Criteria Query. Test case will be checked in later.

git-svn-id: https://svn.apache.org/repos/asf/openjpa/trunk@776136 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Fay Wang 2009-05-18 23:41:43 +00:00
parent 2ce5299a73
commit db43c7443d
3 changed files with 72 additions and 14 deletions

View File

@ -540,7 +540,7 @@ public class CriteriaBuilder implements QueryBuilder, ExpressionParser {
public <Y> Selection<Y> select(Class<Y> result, public <Y> Selection<Y> select(Class<Y> result,
Selection<?>... selections) { Selection<?>... selections) {
throw new AbstractMethodError(); return new SelectionImpl(result).setSelections(selections);
} }
public <R> Case<R> selectCase() { public <R> Case<R> selectCase() {

View File

@ -62,6 +62,9 @@ public class CriteriaQueryImpl implements CriteriaQuery {
private PredicateImpl _having; private PredicateImpl _having;
private Boolean _distinct; private Boolean _distinct;
private LinkedMap _parameterTypes; private LinkedMap _parameterTypes;
private Class _resultClass;
private Value[] _projections;
private int _aliasCount = 0;
public CriteriaQueryImpl(MetamodelImpl model) { public CriteriaQueryImpl(MetamodelImpl model) {
this._model = model; this._model = model;
@ -177,6 +180,14 @@ public class CriteriaQueryImpl implements CriteriaQuery {
_parameterTypes = parameterTypes; _parameterTypes = parameterTypes;
} }
public void setResultClass(Class resultClass) {
_resultClass = resultClass;
}
public void setProjections(Value[] projections) {
_projections = projections;
}
/** /**
* Populate kernel expressions. * Populate kernel expressions.
*/ */
@ -206,14 +217,13 @@ public class CriteriaQueryImpl implements CriteriaQuery {
evalOrdering(exps, factory); evalOrdering(exps, factory);
// exps.operation = QueryOperations.OP_SELECT; // exps.operation = QueryOperations.OP_SELECT;
// exps.parameterTypes = null; // LinkedMap<> evalProjection(exps, factory);
// exps.projectionAliases = null; // String[]
// exps.projectionClauses = null; // String[]
exps.projections = toValues(factory, getSelectionList());
// exps.range = null; // Value[] // exps.range = null; // Value[]
// exps.resultClass = null; // Class // exps.resultClass = null; // Class
if (_parameterTypes != null) if (_parameterTypes != null)
exps.parameterTypes = _parameterTypes; exps.parameterTypes = _parameterTypes;
exps.resultClass = _resultClass;
return exps; return exps;
} }
@ -249,19 +259,31 @@ public class CriteriaQueryImpl implements CriteriaQuery {
(ExpressionImpl<?>)groupBy, factory, _model, this);; (ExpressionImpl<?>)groupBy, factory, _model, this);;
} }
} }
Value[] toValues(ExpressionFactory factory, List<Selection<?>> sels) { void evalProjection(QueryExpressions exps, ExpressionFactory factory) {
Value [] projs = toValues(exps, factory, getSelectionList());
if (projs.length == 1 && projs[0] == null)
exps.projections = _projections;
else
exps.projections = projs;
//exps.projectionClauses = String[];
}
Value[] toValues(QueryExpressions exps, ExpressionFactory factory,
List<Selection<?>> sels) {
if (sels == null || (sels.size() == 1 && sels.get(0) == getRoot())) if (sels == null || (sels.size() == 1 && sels.get(0) == getRoot()))
return new Value[0]; return new Value[0];
Value[] result = new Value[sels.size()]; Value[] result = new Value[sels.size()];
String[] aliases = new String[sels.size()];
int i = 0; int i = 0;
for (Selection<?> s : sels) { for (Selection<?> s : sels) {
result[i++] = ((ExpressionImpl<?>)s).toValue(factory, _model, result[i] = ((SelectionImpl<?>)s).toValue(factory, _model,
this); this);
} aliases[i] = nextAlias();
i++;
}
exps.projectionAliases = aliases;
return result; return result;
} }
@ -323,4 +345,9 @@ public class CriteriaQueryImpl implements CriteriaQuery {
if (_parameterTypes.containsKey(paramKey)) if (_parameterTypes.containsKey(paramKey))
_parameterTypes.put(paramKey, type); _parameterTypes.put(paramKey, type);
} }
private String nextAlias() {
return "jpqlalias" + (++_aliasCount);
}
} }

View File

@ -18,9 +18,16 @@
*/ */
package org.apache.openjpa.persistence.criteria; package org.apache.openjpa.persistence.criteria;
import java.util.Arrays;
import java.util.List;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Selection; import javax.persistence.criteria.Selection;
import org.apache.openjpa.kernel.exps.ExpressionFactory;
import org.apache.openjpa.kernel.exps.Value;
import org.apache.openjpa.persistence.ResultItemImpl; import org.apache.openjpa.persistence.ResultItemImpl;
import org.apache.openjpa.persistence.meta.MetamodelImpl;
/** /**
* An item selected in the projection clause of Criteria query. * An item selected in the projection clause of Criteria query.
@ -31,8 +38,32 @@ import org.apache.openjpa.persistence.ResultItemImpl;
*/ */
public class SelectionImpl<X> extends ResultItemImpl<X> public class SelectionImpl<X> extends ResultItemImpl<X>
implements Selection<X> { implements Selection<X> {
private List<Selection<?>> _sels;
public SelectionImpl(Class<X> cls) { public SelectionImpl(Class<X> cls) {
super(cls); super(cls);
} }
public SelectionImpl setSelections(Selection<?>... selections) {
_sels = Arrays.asList(selections);
return this;
}
public List<Selection<?>> getSelections() {
return _sels;
}
Value toValue(ExpressionFactory factory, MetamodelImpl model,
CriteriaQuery q) {
((CriteriaQueryImpl)q).setResultClass(getJavaType());
Value[] result = new Value[_sels.size()];
int i = 0;
for (Selection<?> s : _sels) {
result[i++] = ((ExpressionImpl<?>)s).toValue(factory, model,
q);
}
((CriteriaQueryImpl)q).setProjections(result);
return null;
}
} }