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,
Selection<?>... selections) {
throw new AbstractMethodError();
return new SelectionImpl(result).setSelections(selections);
}
public <R> Case<R> selectCase() {

View File

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

View File

@ -18,9 +18,16 @@
*/
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 org.apache.openjpa.kernel.exps.ExpressionFactory;
import org.apache.openjpa.kernel.exps.Value;
import org.apache.openjpa.persistence.ResultItemImpl;
import org.apache.openjpa.persistence.meta.MetamodelImpl;
/**
* An item selected in the projection clause of Criteria query.
@ -32,7 +39,31 @@ import org.apache.openjpa.persistence.ResultItemImpl;
public class SelectionImpl<X> extends ResultItemImpl<X>
implements Selection<X> {
private List<Selection<?>> _sels;
public SelectionImpl(Class<X> 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;
}
}