mirror of https://github.com/apache/openjpa.git
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:
parent
2ce5299a73
commit
db43c7443d
|
@ -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() {
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue