EJB-447 : Implement JPA 2.0 criteria apis
git-svn-id: https://svn.jboss.org/repos/hibernate/core/trunk@17264 1b8cb986-b30d-0410-93ca-fae66ebed9b2
This commit is contained in:
parent
8de99d279d
commit
ed6346174d
|
@ -38,7 +38,8 @@ import javax.persistence.metamodel.EntityType;
|
||||||
import org.hibernate.ejb.criteria.expression.ExpressionImpl;
|
import org.hibernate.ejb.criteria.expression.ExpressionImpl;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TODO : javadoc
|
* The Hibernate implementation of the JPA {@link Subquery} contract. Mostlty a set of delegation to its internal
|
||||||
|
* {@link QueryStructure}.
|
||||||
*
|
*
|
||||||
* @author Steve Ebersole
|
* @author Steve Ebersole
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -813,9 +813,11 @@ public class QueryBuilderImpl implements QueryBuilder, Serializable {
|
||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
*/
|
*/
|
||||||
public <N extends Number> Expression<N> sum(Expression<? extends N> expression1, Expression<? extends N> expression2) {
|
public <N extends Number> Expression<N> sum(Expression<? extends N> expression1, Expression<? extends N> expression2) {
|
||||||
|
Class<N> type = (Class<N>)BinaryArithmeticOperation.determineReturnType( (Class)Number.class, (Expression)expression1 );
|
||||||
|
type = (Class<N>)BinaryArithmeticOperation.determineReturnType( type, (Expression)expression2 );
|
||||||
return new BinaryArithmeticOperation<N>(
|
return new BinaryArithmeticOperation<N>(
|
||||||
this,
|
this,
|
||||||
(Class<N>) expression1.getJavaType(),
|
type,
|
||||||
BinaryArithmeticOperation.Operation.ADD,
|
BinaryArithmeticOperation.Operation.ADD,
|
||||||
expression1,
|
expression1,
|
||||||
expression2
|
expression2
|
||||||
|
@ -826,9 +828,11 @@ public class QueryBuilderImpl implements QueryBuilder, Serializable {
|
||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
*/
|
*/
|
||||||
public <N extends Number> Expression<N> prod(Expression<? extends N> expression1, Expression<? extends N> expression2) {
|
public <N extends Number> Expression<N> prod(Expression<? extends N> expression1, Expression<? extends N> expression2) {
|
||||||
|
Class<N> type = (Class<N>)BinaryArithmeticOperation.determineReturnType( (Class)Number.class, (Expression)expression1 );
|
||||||
|
type = (Class<N>)BinaryArithmeticOperation.determineReturnType( type, (Expression)expression2 );
|
||||||
return new BinaryArithmeticOperation<N>(
|
return new BinaryArithmeticOperation<N>(
|
||||||
this,
|
this,
|
||||||
(Class<N>) expression1.getJavaType(),
|
type,
|
||||||
BinaryArithmeticOperation.Operation.MULTIPLY,
|
BinaryArithmeticOperation.Operation.MULTIPLY,
|
||||||
expression1,
|
expression1,
|
||||||
expression2
|
expression2
|
||||||
|
@ -839,6 +843,8 @@ public class QueryBuilderImpl implements QueryBuilder, Serializable {
|
||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
*/
|
*/
|
||||||
public <N extends Number> Expression<N> diff(Expression<? extends N> expression1, Expression<? extends N> expression2) {
|
public <N extends Number> Expression<N> diff(Expression<? extends N> expression1, Expression<? extends N> expression2) {
|
||||||
|
Class<N> type = (Class<N>)BinaryArithmeticOperation.determineReturnType( (Class)Number.class, (Expression)expression1 );
|
||||||
|
type = (Class<N>)BinaryArithmeticOperation.determineReturnType( type, (Expression)expression2 );
|
||||||
return new BinaryArithmeticOperation<N>(
|
return new BinaryArithmeticOperation<N>(
|
||||||
this,
|
this,
|
||||||
(Class<N>) expression1.getJavaType(),
|
(Class<N>) expression1.getJavaType(),
|
||||||
|
@ -852,9 +858,11 @@ public class QueryBuilderImpl implements QueryBuilder, Serializable {
|
||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
*/
|
*/
|
||||||
public <N extends Number> Expression<N> sum(Expression<? extends N> expression, N n) {
|
public <N extends Number> Expression<N> sum(Expression<? extends N> expression, N n) {
|
||||||
|
Class<N> type = (Class<N>)BinaryArithmeticOperation.determineReturnType( (Class)Number.class, (Expression)expression );
|
||||||
|
type = (Class<N>)BinaryArithmeticOperation.determineReturnType( type, n );
|
||||||
return new BinaryArithmeticOperation<N>(
|
return new BinaryArithmeticOperation<N>(
|
||||||
this,
|
this,
|
||||||
(Class<N>) expression.getJavaType(),
|
type,
|
||||||
BinaryArithmeticOperation.Operation.ADD,
|
BinaryArithmeticOperation.Operation.ADD,
|
||||||
expression,
|
expression,
|
||||||
n
|
n
|
||||||
|
@ -865,9 +873,11 @@ public class QueryBuilderImpl implements QueryBuilder, Serializable {
|
||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
*/
|
*/
|
||||||
public <N extends Number> Expression<N> prod(Expression<? extends N> expression, N n) {
|
public <N extends Number> Expression<N> prod(Expression<? extends N> expression, N n) {
|
||||||
|
Class<N> type = (Class<N>)BinaryArithmeticOperation.determineReturnType( (Class)Number.class, (Expression)expression );
|
||||||
|
type = (Class<N>)BinaryArithmeticOperation.determineReturnType( type, n );
|
||||||
return new BinaryArithmeticOperation<N>(
|
return new BinaryArithmeticOperation<N>(
|
||||||
this,
|
this,
|
||||||
(Class<N>) expression.getJavaType(),
|
type,
|
||||||
BinaryArithmeticOperation.Operation.MULTIPLY,
|
BinaryArithmeticOperation.Operation.MULTIPLY,
|
||||||
expression,
|
expression,
|
||||||
n
|
n
|
||||||
|
@ -878,9 +888,11 @@ public class QueryBuilderImpl implements QueryBuilder, Serializable {
|
||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
*/
|
*/
|
||||||
public <N extends Number> Expression<N> diff(Expression<? extends N> expression, N n) {
|
public <N extends Number> Expression<N> diff(Expression<? extends N> expression, N n) {
|
||||||
|
Class<N> type = (Class<N>)BinaryArithmeticOperation.determineReturnType( (Class)Number.class, (Expression)expression );
|
||||||
|
type = (Class<N>)BinaryArithmeticOperation.determineReturnType( type, n );
|
||||||
return new BinaryArithmeticOperation<N>(
|
return new BinaryArithmeticOperation<N>(
|
||||||
this,
|
this,
|
||||||
(Class<N>) expression.getJavaType(),
|
type,
|
||||||
BinaryArithmeticOperation.Operation.SUBTRACT,
|
BinaryArithmeticOperation.Operation.SUBTRACT,
|
||||||
expression,
|
expression,
|
||||||
n
|
n
|
||||||
|
@ -891,9 +903,11 @@ public class QueryBuilderImpl implements QueryBuilder, Serializable {
|
||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
*/
|
*/
|
||||||
public <N extends Number> Expression<N> sum(N n, Expression<? extends N> expression) {
|
public <N extends Number> Expression<N> sum(N n, Expression<? extends N> expression) {
|
||||||
|
Class<N> type = (Class<N>)BinaryArithmeticOperation.determineReturnType( (Class)Number.class, (Expression)expression );
|
||||||
|
type = (Class<N>)BinaryArithmeticOperation.determineReturnType( type, n );
|
||||||
return new BinaryArithmeticOperation<N>(
|
return new BinaryArithmeticOperation<N>(
|
||||||
this,
|
this,
|
||||||
(Class<N>) expression.getJavaType(),
|
type,
|
||||||
BinaryArithmeticOperation.Operation.ADD,
|
BinaryArithmeticOperation.Operation.ADD,
|
||||||
n,
|
n,
|
||||||
expression
|
expression
|
||||||
|
@ -904,9 +918,11 @@ public class QueryBuilderImpl implements QueryBuilder, Serializable {
|
||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
*/
|
*/
|
||||||
public <N extends Number> Expression<N> prod(N n, Expression<? extends N> expression) {
|
public <N extends Number> Expression<N> prod(N n, Expression<? extends N> expression) {
|
||||||
|
Class<N> type = (Class<N>)BinaryArithmeticOperation.determineReturnType( (Class)Number.class, (Expression)expression );
|
||||||
|
type = (Class<N>)BinaryArithmeticOperation.determineReturnType( type, n );
|
||||||
return new BinaryArithmeticOperation<N>(
|
return new BinaryArithmeticOperation<N>(
|
||||||
this,
|
this,
|
||||||
(Class<N>) expression.getJavaType(),
|
type,
|
||||||
BinaryArithmeticOperation.Operation.MULTIPLY,
|
BinaryArithmeticOperation.Operation.MULTIPLY,
|
||||||
n,
|
n,
|
||||||
expression
|
expression
|
||||||
|
@ -917,9 +933,11 @@ public class QueryBuilderImpl implements QueryBuilder, Serializable {
|
||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
*/
|
*/
|
||||||
public <N extends Number> Expression<N> diff(N n, Expression<? extends N> expression) {
|
public <N extends Number> Expression<N> diff(N n, Expression<? extends N> expression) {
|
||||||
|
Class<N> type = (Class<N>)BinaryArithmeticOperation.determineReturnType( (Class)Number.class, (Expression)expression );
|
||||||
|
type = (Class<N>)BinaryArithmeticOperation.determineReturnType( type, n );
|
||||||
return new BinaryArithmeticOperation<N>(
|
return new BinaryArithmeticOperation<N>(
|
||||||
this,
|
this,
|
||||||
(Class<N>) expression.getJavaType(),
|
type,
|
||||||
BinaryArithmeticOperation.Operation.SUBTRACT,
|
BinaryArithmeticOperation.Operation.SUBTRACT,
|
||||||
n,
|
n,
|
||||||
expression
|
expression
|
||||||
|
@ -930,24 +948,39 @@ public class QueryBuilderImpl implements QueryBuilder, Serializable {
|
||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
*/
|
*/
|
||||||
public Expression<Number> quot(Expression<? extends Number> expression1, Expression<? extends Number> expression2) {
|
public Expression<Number> quot(Expression<? extends Number> expression1, Expression<? extends Number> expression2) {
|
||||||
// TODO : still open question whether this should be a quotient (integer division) or division
|
return new BinaryArithmeticOperation<Number>(
|
||||||
throw new UnsupportedOperationException( "Not yet implemented!" );
|
this,
|
||||||
|
Number.class,
|
||||||
|
BinaryArithmeticOperation.Operation.DIVIDE,
|
||||||
|
expression1,
|
||||||
|
expression2
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
*/
|
*/
|
||||||
public Expression<Number> quot(Expression<? extends Number> expression, Number number) {
|
public Expression<Number> quot(Expression<? extends Number> expression, Number number) {
|
||||||
// TODO : still open question whether this should be a quotient (integer division) or division
|
return new BinaryArithmeticOperation<Number>(
|
||||||
throw new UnsupportedOperationException( "Not yet implemented!" );
|
this,
|
||||||
|
Number.class,
|
||||||
|
BinaryArithmeticOperation.Operation.DIVIDE,
|
||||||
|
expression,
|
||||||
|
number
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
*/
|
*/
|
||||||
public Expression<Number> quot(Number number, Expression<? extends Number> expression) {
|
public Expression<Number> quot(Number number, Expression<? extends Number> expression) {
|
||||||
// TODO : still open question whether this should be a quotient (integer division) or division
|
return new BinaryArithmeticOperation<Number>(
|
||||||
throw new UnsupportedOperationException( "Not yet implemented!" );
|
this,
|
||||||
|
Number.class,
|
||||||
|
BinaryArithmeticOperation.Operation.DIVIDE,
|
||||||
|
number,
|
||||||
|
expression
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -23,7 +23,6 @@ package org.hibernate.ejb.criteria.expression;
|
||||||
|
|
||||||
import javax.persistence.criteria.Expression;
|
import javax.persistence.criteria.Expression;
|
||||||
|
|
||||||
import org.hibernate.ejb.criteria.ParameterContainer;
|
|
||||||
import org.hibernate.ejb.criteria.ParameterRegistry;
|
import org.hibernate.ejb.criteria.ParameterRegistry;
|
||||||
import org.hibernate.ejb.criteria.QueryBuilderImpl;
|
import org.hibernate.ejb.criteria.QueryBuilderImpl;
|
||||||
|
|
||||||
|
@ -44,18 +43,66 @@ public class BinaryArithmeticOperation<N extends Number>
|
||||||
private final Expression<? extends N> rhs;
|
private final Expression<? extends N> rhs;
|
||||||
private final Expression<? extends N> lhs;
|
private final Expression<? extends N> lhs;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper for determining the appropriate operation return type based on one of the operands as an expression.
|
||||||
|
*
|
||||||
|
* @param defaultType The default return type to use if we cannot determine the java type of 'expression' operand.
|
||||||
|
* @param expression The operand.
|
||||||
|
*
|
||||||
|
* @return The appropriate return type.
|
||||||
|
*/
|
||||||
|
public static Class<? extends Number> determineReturnType(
|
||||||
|
Class<? extends Number> defaultType,
|
||||||
|
Expression<? extends Number> expression) {
|
||||||
|
return expression == null || expression.getJavaType() == null
|
||||||
|
? defaultType
|
||||||
|
: expression.getJavaType();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper for determining the appropriate operation return type based on one of the operands as a literal.
|
||||||
|
*
|
||||||
|
* @param defaultType The default return type to use if we cannot determine the java type of 'numberLiteral' operand.
|
||||||
|
* @param numberLiteral The operand.
|
||||||
|
*
|
||||||
|
* @return The appropriate return type.
|
||||||
|
*/
|
||||||
|
public static Class<? extends Number> determineReturnType(
|
||||||
|
Class<? extends Number> defaultType,
|
||||||
|
Number numberLiteral) {
|
||||||
|
return numberLiteral == null ? defaultType : numberLiteral.getClass();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates an arithmethic operation based on 2 expressions.
|
||||||
|
*
|
||||||
|
* @param queryBuilder The builder for query components.
|
||||||
|
* @param resultType The operation result type
|
||||||
|
* @param operator The operator (type of operation).
|
||||||
|
* @param rhs The right-hand operand
|
||||||
|
* @param lhs The left-hand operand.
|
||||||
|
*/
|
||||||
public BinaryArithmeticOperation(
|
public BinaryArithmeticOperation(
|
||||||
QueryBuilderImpl queryBuilder,
|
QueryBuilderImpl queryBuilder,
|
||||||
Class<N> javaType,
|
Class<N> resultType,
|
||||||
Operation operator,
|
Operation operator,
|
||||||
Expression<? extends N> rhs,
|
Expression<? extends N> rhs,
|
||||||
Expression<? extends N> lhs) {
|
Expression<? extends N> lhs) {
|
||||||
super( queryBuilder, javaType );
|
super( queryBuilder, resultType );
|
||||||
this.operator = operator;
|
this.operator = operator;
|
||||||
this.rhs = rhs;
|
this.rhs = rhs;
|
||||||
this.lhs = lhs;
|
this.lhs = lhs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates an arithmethic operation based on an expression and a literal.
|
||||||
|
*
|
||||||
|
* @param queryBuilder The builder for query components.
|
||||||
|
* @param resultType The operation result type
|
||||||
|
* @param operator The operator (type of operation).
|
||||||
|
* @param rhs The right-hand operand
|
||||||
|
* @param lhs The left-hand operand (the literal).
|
||||||
|
*/
|
||||||
public BinaryArithmeticOperation(
|
public BinaryArithmeticOperation(
|
||||||
QueryBuilderImpl queryBuilder,
|
QueryBuilderImpl queryBuilder,
|
||||||
Class<N> javaType,
|
Class<N> javaType,
|
||||||
|
@ -68,6 +115,15 @@ public class BinaryArithmeticOperation<N extends Number>
|
||||||
this.lhs = new LiteralExpression<N>( queryBuilder, lhs );
|
this.lhs = new LiteralExpression<N>( queryBuilder, lhs );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates an arithmethic operation based on an expression and a literal.
|
||||||
|
*
|
||||||
|
* @param queryBuilder The builder for query components.
|
||||||
|
* @param resultType The operation result type
|
||||||
|
* @param operator The operator (type of operation).
|
||||||
|
* @param rhs The right-hand operand (the literal).
|
||||||
|
* @param lhs The left-hand operand
|
||||||
|
*/
|
||||||
public BinaryArithmeticOperation(
|
public BinaryArithmeticOperation(
|
||||||
QueryBuilderImpl queryBuilder,
|
QueryBuilderImpl queryBuilder,
|
||||||
Class<N> javaType,
|
Class<N> javaType,
|
||||||
|
@ -79,19 +135,27 @@ public class BinaryArithmeticOperation<N extends Number>
|
||||||
this.rhs = new LiteralExpression<N>( queryBuilder, rhs );
|
this.rhs = new LiteralExpression<N>( queryBuilder, rhs );
|
||||||
this.lhs = lhs;
|
this.lhs = lhs;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Operation getOperator() {
|
public Operation getOperator() {
|
||||||
return operator;
|
return operator;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
public Expression<? extends N> getRightHandOperand() {
|
public Expression<? extends N> getRightHandOperand() {
|
||||||
return rhs;
|
return rhs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
public Expression<? extends N> getLeftHandOperand() {
|
public Expression<? extends N> getLeftHandOperand() {
|
||||||
return lhs;
|
return lhs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
public void registerParameters(ParameterRegistry registry) {
|
public void registerParameters(ParameterRegistry registry) {
|
||||||
Helper.possibleParameter( getRightHandOperand(), registry );
|
Helper.possibleParameter( getRightHandOperand(), registry );
|
||||||
Helper.possibleParameter( getLeftHandOperand(), registry );
|
Helper.possibleParameter( getLeftHandOperand(), registry );
|
||||||
|
|
|
@ -1,12 +1,11 @@
|
||||||
package org.hibernate.ejb.criteria.expression;
|
package org.hibernate.ejb.criteria.expression;
|
||||||
|
|
||||||
import javax.persistence.criteria.Expression;
|
import javax.persistence.criteria.Expression;
|
||||||
import org.hibernate.ejb.criteria.ParameterContainer;
|
|
||||||
import org.hibernate.ejb.criteria.ParameterRegistry;
|
import org.hibernate.ejb.criteria.ParameterRegistry;
|
||||||
import org.hibernate.ejb.criteria.QueryBuilderImpl;
|
import org.hibernate.ejb.criteria.QueryBuilderImpl;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Models arithmetc operations with two operands.
|
* Models unary arithmetic operation (unary plus and unary minus).
|
||||||
*
|
*
|
||||||
* @author Steve Ebersole
|
* @author Steve Ebersole
|
||||||
*/
|
*/
|
||||||
|
@ -30,14 +29,20 @@ public class UnaryArithmeticOperation<T>
|
||||||
this.operand = operand;
|
this.operand = operand;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Expression<T> getOperand() {
|
|
||||||
return operand;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Operation getOperation() {
|
public Operation getOperation() {
|
||||||
return operation;
|
return operation;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
public Expression<T> getOperand() {
|
||||||
|
return operand;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
public void registerParameters(ParameterRegistry registry) {
|
public void registerParameters(ParameterRegistry registry) {
|
||||||
Helper.possibleParameter( getOperand(), registry );
|
Helper.possibleParameter( getOperand(), registry );
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue